如何根据 SQL Server 中的某个列删除重复项? [复制]

Posted

技术标签:

【中文标题】如何根据 SQL Server 中的某个列删除重复项? [复制]【英文标题】:How to remove duplicates based on a certain column in SQL Server? [duplicate] 【发布时间】:2021-12-08 19:46:51 【问题描述】:

如果我有这样的桌子

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 条记录日期显示两次。

【问题讨论】:

首先听起来您想从表中删除行(“删除重复项”),然后听起来您只想选择没有重复项的行(“获取其他列”)。你要哪个? DELETESELECT? 不删除原始数据,只是获取一个不包含我想要删除的查询。所以我要选择。 【参考方案1】:

我们可以在这里使用可删除的 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 的两条记录也具有相同的最新日期,则它会保留较早的名称。

【讨论】:

请注意,我只想选择,而不是删除任何实际数据。 @omega:然后将DELETE 替换为SELECT *(或者更确切地说是您要选择的列)。 @omega 然后使用相同的 CTE,但使用 SELECT * FROM cte WHERE rn = 1

以上是关于如何根据 SQL Server 中的某个列删除重复项? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何根据列值SQL Server扩展表[重复]

SQL SERVER 2005删除重复数据

删除 MS SQL Server 中的列

怎么样删除SQL SERVER 数据库中重复的数据

如何从 SQL Server 中的表中删除重复行 [重复]

如何保持某些列原样并动态旋转 SQL Server 2012 中的最后一列 [重复]