如何基于最近更新的行“删除”行

时间:2018-11-03 06:50:14

标签: sql greatest-n-per-group

让我们说我有一个表,其内容看起来像

ID     Name      Last Update
============================
1      A         1 JAN 2018
1      A         2 JAN 2018
1      A         3 JAN 2018
2      B         3 JAN 2018
2      B         6 JAN 2018

我想得到结果

ID     Name      Last Update
============================
1      A         3 JAN 2018
2      B         6 JAN 2018

我该怎么办?

我试图按ID分组,但是如何获取最新的ID?

2 个答案:

答案 0 :(得分:1)

虽然@Nik的解决方案可以在MAX(date)值没有联系(或者选择哪个联系值以及是否产生多个输出行都无关紧要)的情况下工作,但是一种替代方法是按ID对所有记录进行分组,按date降序对属于一个组的所有记录进行排序,然后选择每个组的第一行结果。

这可以通过使用SQL标准窗口函数ROW_NUMBER()来实现,例如:

SELECT ID, NAME, DATE
FROM (
      SELECT ROW_NUMBER() OVER (PARTITION BY ID 
                               ORDER BY DATE DESC) RN
            , ID
            , NAME
            , DATE
      FROM <TABLE_NAME>
      ) 
WHERE RN = 1;

答案 1 :(得分:0)

您可以使用类似的查询来获取所需的结果:

SELECT *
FROM   table
WHERE  (ID, date) IN (SELECT 
                            ID, MAX(Last Update) 
                      FROM table
                      GROUP BY ID)