开发者社区 问答 正文

SQL Server:删除4列匹配的重复项,但将具有特定值的重复项保留在另一列中

SQL Server:删除4列匹配的重复项,但将具有特定值的重复项保留在另一列中

展开
收起
SONGYiiiD 2019-12-02 22:51:50 551 分享 版权
阿里云 AI 助理回答

要在SQL Server中删除具有四列匹配的重复项,但保留另一列中具有特定值的重复行,您可以使用ROW_NUMBER()窗口函数配合CTE(Common Table Expression)来实现这一需求。以下是一个示例SQL脚本,假设您有以下需求:

  • 表名为 YourTable
  • 四列匹配的列名分别为 Column1, Column2, Column3, Column4
  • 需要保留特定值的列为 SpecialColumn
  • 特定值为 DesiredValue
WITH CTE_Duplicates AS (
    SELECT *,
           ROW_NUMBER() OVER (
               PARTITION BY Column1, Column2, Column3, Column4 -- 分组依据四列
               ORDER BY SpecialColumn DESC -- 保留SpecialColumn为DesiredValue的行优先
           ) AS RowNum
    FROM YourTable
    WHERE SpecialColumn <> 'DesiredValue' -- 先排除SpecialColumn为DesiredValue的行
)
DELETE FROM CTE_Duplicates
WHERE RowNum > 1; -- 删除分组后RowNum大于1的行,即除保留行之外的重复行

步骤说明:

  1. 定义CTE: 使用WITH语句创建一个临时的结果集(CTE),在这个CTE中,通过ROW_NUMBER()函数为每个四列匹配的组分配一个唯一的行号。这里的关键是通过PARTITION BY子句指定了哪些列为分组依据,确保了只有这些列完全相同的记录才会被看作重复。

  2. 排序规则: 在ORDER BY子句中,我们指定按SpecialColumn降序排列。这样,如果存在SpecialColumnDesiredValue的行,它将获得最低的行号(即1),从而在后续的删除操作中得以保留。

  3. 筛选与删除: 在CTE定义之后,执行DELETE操作,仅删除那些在CTE中RowNum大于1的记录,这意味着除了每组中按照上述规则保留的第一行外,其他所有重复行都将被删除。

请注意,执行此类删除操作前,请务必做好数据备份,以防止意外数据丢失。此外,根据您的实际表结构和字段名称调整上述脚本。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答