我有以下SQL表:
Name Description Id UserId CreatedDate
UserSet1 Desc1 1 Abc 06/01/2018
UserSet1 Desc2 2 Def 06/02/2018
UserSet2 Desc for 2 5 NewUser 06/04/2018
UserSet2 Desc for 2 7 NewUser 06/19/2018
我想从上表中提取的只是每个名称的最新 Id,以便我可以获得以下输出
Name Description Id UserId CreatedDate
UserSet1 Desc2 2 Def 06/01/2018
UserSet2 Desc for 2 7 NewUser 06/19/2018
由于 Id 2 和 7 是 UserSet1 和 UserSet2 表中的最新条目,因此我想显示它而不是表中的所有条目。
任何输入如何获得所需的结果。
我也愿意接受直接返回输出的解决方案或任何 linq (C#( 解决方案。即返回整个数据集,然后使用 linq 过滤上述内容。
编辑:由于您正在寻找最高的数字ID,因此GROUP BY
方法可能更容易使用。
使用窗口函数:
SELECT *
FROM (
SELECT Name, Description, Id, UserId, CreatedDate
, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY CreatedDate DESC) AS rn
FROM myTable
) s1
WHERE rn = 1
我没有 dynamoDB 的实例可以测试,但我相信它可以使用ROW_NUMBER()
窗口函数。
感谢大家指出正确的方向。我已经在下面的 Linq 和 C# 代码中得到了这个:
var results = response.GroupBy(row => row.Name)
.SelectMany(g => g.OrderByDescending(row => row.Id).Take(1));
对于初始测试,这似乎正在起作用。如果您认为这出现了问题,请告诉我。
这应该是一个通用的SQL答案:
SELECT * FROM yourtable Y1
WHERE Id = (SELECT MAX(Id)
FROM yourtable Y2
WHERE Y2.Name = Y1.Name)
如果是MS SQL,您可以使用Partition By 命令,否则最高性能的方式是:
select * from Table
where Id in (
select Max(Id) from Table
Group By Name
)
不确定是否可以将 Name 排除在 Select 语句之外,您可能需要执行以下操作:
select * from Table
where Id in (
Select Id from
(select Name, Max(Id) as Id from Table
Group By Name)
)