如果我有一个这样的表
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
的两条记录也具有相同的最新日期,则它将保留较早的名称。