[英]SQL Query: Display only latest Id from each set
我有以下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)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.