从重复行中选择一项
Selecting one item from duplicate rows
我有一个 SQL 查询来检查 table 并给我找到的任何重复项。我需要做的只是select其中之一,最好每次都一样。
这是我的查询:
SELECT COUNT(t.Value) AS Count,
t.Code
FROM dbo.Table t
GROUP BY t.Code, t.Value
HAVING COUNT(t.Value) > 1
它returns我的结果如下:
Count Code
2 Duplicate_1
2 Duplicate_2
2 Duplicate_3
其中每一个都有自己的 ID
,我想弄清楚如何只抓取一个 ID
或 top 1 id
,但还没有找到可行的解决方案还没有。
我只需要每个 Code
中的 ID
一个,这样我就可以稍后删除它。
这是 table 的样子。理想情况下应该永远只有一行 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
如果要删除 SQL 服务器中的重复项,请使用可更新的 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
列,您可以删除除最旧或最新之外的所有列。
根据您的示例数据和预期结果,您可以使用 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
| Id | Code |
|----|-------------|
| 3 | Duplicate_1 |
| 4 | Duplicate_2 |
| 1 | Duplicate_3 |
我有一个 SQL 查询来检查 table 并给我找到的任何重复项。我需要做的只是select其中之一,最好每次都一样。
这是我的查询:
SELECT COUNT(t.Value) AS Count,
t.Code
FROM dbo.Table t
GROUP BY t.Code, t.Value
HAVING COUNT(t.Value) > 1
它returns我的结果如下:
Count Code
2 Duplicate_1
2 Duplicate_2
2 Duplicate_3
其中每一个都有自己的 ID
,我想弄清楚如何只抓取一个 ID
或 top 1 id
,但还没有找到可行的解决方案还没有。
我只需要每个 Code
中的 ID
一个,这样我就可以稍后删除它。
这是 table 的样子。理想情况下应该永远只有一行 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
如果要删除 SQL 服务器中的重复项,请使用可更新的 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
列,您可以删除除最旧或最新之外的所有列。
根据您的示例数据和预期结果,您可以使用 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
| Id | Code |
|----|-------------|
| 3 | Duplicate_1 |
| 4 | Duplicate_2 |
| 1 | Duplicate_3 |