我有一个SQL查询,该查询检查表并提供发现的所有重复项。我需要做的是仅选择其中之一,最好每次都选择相同的一个。
这是我的查询:
SELECT COUNT(t.Value) AS Count,
t.Code
FROM dbo.Table t
GROUP BY t.Code, t.Value
HAVING COUNT(t.Value) > 1
它向我返回如下结果:
Count Code
2 Duplicate_1
2 Duplicate_2
2 Duplicate_3
其中每个人都有自己的ID
,我正在尝试找出如何仅获取一个ID
或top 1 id
的方法,但至今尚未找到可行的解决方案
我只需要每个ID
中的Code
个,以便以后可以删除它。
这是表格的外观。理想情况下,Code
应该永远有一行,但是不知何故重复发生了。
id Value Code
1 3 Duplicate_3
2 63 Im_Not_A_Dup
3 1 Duplicate_1
4 2 Duplicate_2
5 2 Duplicate_2
6 64 Im_Not_A_Dup
7 1 Duplicate_1
8 65 Im_Not_A_Dup
9 66 Im_Not_A_Dup
10 3 Duplicate_3
预期结果:
id Type_Code
3 Duplicate_1
4 Duplicate_2
1 Duplicate_3
答案 0 :(得分:2)
如果要在SQL Server中删除重复项,请使用可更新的CTE和row_number()
:
with todelete as (
select t.*, row_number() over (partition by code, id order by code) as seqnum
from dbo.table t
)
delete from todelete
where seqnum > 1;
您可以使用更具确定性的顺序替换order by code
。例如,如果您有一个createAt
列,则可以删除除最旧或最近的列之外的所有列。
答案 1 :(得分:2)
从示例数据和预期结果中,您可以使用MIN
函数来获取ID
,并使用where
子句来排除code = 'Im_Not_A_Dup'
CREATE TABLE T(
id INT,
Code VARCHAR(50)
);
INSERT INTO T VALUES (1,'Duplicate_3');
INSERT INTO T VALUES (2,'Im_Not_A_Dup');
INSERT INTO T VALUES (3,'Duplicate_1');
INSERT INTO T VALUES (4,'Duplicate_2');
INSERT INTO T VALUES (5,'Duplicate_2');
INSERT INTO T VALUES (6,'Im_Not_A_Dup');
INSERT INTO T VALUES (7,'Duplicate_1');
INSERT INTO T VALUES (8,'Im_Not_A_Dup');
INSERT INTO T VALUES (9,'Im_Not_A_Dup');
INSERT INTO T VALUES (10,'Duplicate_3');
查询1 :
SELECT MIN(t.Id) Id,
t.Code
FROM t
WHERE Code <> 'Im_Not_A_Dup'
GROUP BY t.Code
Results :
| Id | Code |
|----|-------------|
| 3 | Duplicate_1 |
| 4 | Duplicate_2 |
| 1 | Duplicate_3 |