gpt4 book ai didi

tsql - SQL删除具有重复值的行,同时保留一个

转载 作者:行者123 更新时间:2023-12-03 23:32:13 25 4
gpt4 key购买 nike

说我有这张 table

id | data | value
-----------------
1 | a | A
2 | a | A
3 | a | A
4 | a | B
5 | b | C
6 | c | A
7 | c | C
8 | c | C

我想为每个数据删除那些具有重复值的行,同时保留具有最小 ID 的行,例如结果将是
id | data | value
-----------------
1 | a | A
4 | a | B
5 | b | C
6 | c | A
7 | c | C

我知道一种方法是做一个工会,如:
SELECT 1 [id], 'a' [data], 'A' [value] INTO #test UNION SELECT 2, 'a', 'A'
UNION SELECT 3, 'a', 'A' UNION SELECT 4, 'a', 'B'
UNION SELECT 5, 'b', 'C' UNION SELECT 6, 'c', 'A'
UNION SELECT 7, 'c', 'C' UNION SELECT 8, 'c', 'C'

SELECT * FROM #test WHERE id NOT IN (
SELECT MIN(id) FROM #test
GROUP BY [data], [value]
HAVING COUNT(1) > 1
UNION
SELECT MIN(id) FROM #test
GROUP BY [data], [value]
HAVING COUNT(1) <= 1
)

但此解决方案必须将同一组重复两次(考虑实际情况是一个具有 > 20 列的大型组)

与复杂的答案相反,我更喜欢代码更少的更简单的答案。有没有更简洁的方法来编码这个?

谢谢

最佳答案

两种选择:

  • 使用 WITH CTE :
    WITH CTE AS 
    (SELECT *,RN=ROW_NUMBER() OVER(PARTITION BY data,value ORDER BY id)
    FROM TableName)
    DELETE FROM CTE WHERE RN>1

    说明:

    此查询将选择表的内容以及行号 RN .然后用 RN 删除记录>1(这将是重复项)。

    This Fiddle显示将要使用此方法删除的记录。
  • 使用 NOT IN :
    DELETE FROM TableName
    WHERE id NOT IN
    (SELECT MIN(id) as id
    FROM TableName
    GROUP BY data,value)

    说明:

    对于给定的示例,内部查询将返回 ids (1,6,4,5,7)。外部查询将从表中删除 id 的记录不在 (1,6,4,5,7)。

    This fiddle显示将要使用此方法删除的记录。

  • 建议:使用第一种方法,因为它比后者快。此外,如果 id,它只能保留一条记录。字段也为相同的 data 重复和 value .

    关于tsql - SQL删除具有重复值的行,同时保留一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23495734/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com