如何删除重复基于某个列在SQL Server?



如果我有一个这样的表

fid name   date
---------------------
1   John1  2020-10-08
1   John2  2020-10-08
1   John3  2018-06-04
2   Tom1   2019-10-08

我想保留具有最近日期的每个fid的行。但是,如果有多个,只保留1个(其中任何一个都可以)。所以最终的结果应该是

fid name   date
---------------------
1   John1  2020-10-08
2   Tom1   2019-10-08

有人知道如何在SQL Server中做到这一点吗?如果有关系,我使用v14(2017)。

问题是,如果我按fid分组并做Max(date),我每fid得到1条记录,但是当我离开它以获得其他列时,它会给我返回2条记录,因为最近的日期显示两次。

我们可以在这里使用可删除的CTE和ROW_NUMBER:

WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY fid ORDER BY date DESC, name) rn
FROM yourTable
)
DELETE
FROM cte
WHERE rn > 1;

上面的逻辑将分配rn = 1(即备用)最近日期的记录,每组fid记录。如果具有相同fid的两条记录也具有相同的最新日期,则它将保留较早的名称。

相关内容

最新更新