SQL 查询:仅显示每组的最新 ID



我有以下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)
)

最新更新