从重复的行中选择一项

时间:2018-08-14 21:59:18

标签: sql sql-server-2008-r2

我有一个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,我正在尝试找出如何仅获取一个IDtop 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

2 个答案:

答案 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 |