【发布时间】:2018-01-10 06:30:42
【问题描述】:
我需要根据 ID 和时间列删除重复的行。我只需要保留最新时间的记录。如果有两条记录的时间最长,我可以保留任何一条记录并删除其中的所有其他记录该组。请在下面找到我的输入数据
ID TIMES
123 13/01/2018
123 14/01/2018
123 15/01/2018
345 14/01/2018
567 20/01/2018
567 20/01/2018
879 NULL
879 21/01/2018
我已经写了一个查询,但它不适用于 ID=567 的情况,因为它们在时间列中具有相同的值。请在下面找到我的查询
delete FROM table where (ID,times) in(
SELECT ID,times,
RANK() OVER (PARTITION BY ID ORDER BY times DESC NULLS LAST) dest_rank
FROM TABLE
) WHERE dest_rank <> 1
有什么办法可以做到这一点。
【问题讨论】:
-
您可以轻松修复您的解决方案 - 这并不比接受的答案更糟。问题是您使用了
RANK()函数。您应该改用ROW_NUMBER()函数。正如您所发现的,RANK()函数将显示具有相同排名的关系,所以这对您没有帮助。在平局的情况下,ROW_NUMBER()将任意为行分配不同的数字,这就是您所需要的。