如何从以下列方式设置的表中删除重复项?
unique_ID | worker_ID | date | type_ID
一个worker可以有多个与它们相关联的type_ID,我想删除任何重复的类型。如果有重复,我想删除具有最新条目的类型。
答案 0 :(得分:9)
窗口函数row_number()的教科书候选:
;WITH x AS (
SELECT unique_ID
,row_number() OVER (PARTITION BY worker_ID,type_ID ORDER BY date) AS rn
FROM tbl
)
DELETE FROM tbl
FROM x
WHERE tbl.unique_ID = x.unique_ID
AND x.rn > 1
这也解决了(worker_ID,type_ID)
上的一组欺骗共享date
的情况。
请参阅简化的demo on data.SE。
事实证明,这可以简化:在SQL Server中,您可以直接从CTE中删除:
;WITH x AS (
SELECT unique_ID
,row_number() OVER (PARTITION BY worker_ID,type_ID ORDER BY date) AS rn
FROM tbl
)
DELETE x
WHERE rn > 1
答案 1 :(得分:2)
delete from table t
where exists ( select 1 from table t2
where t2.worker_id = t.worker_id
and t2.type_id = t.type_id
and t2.date < t.date )
HTH
答案 2 :(得分:2)
DELETE FROM @t WHERE unique_Id IN
(
SELECT unique_Id FROM
(
SELECT unique_Id
,Type_Id
,ROW_NUMBER() OVER (PARTITION BY worker_Id, type_Id ORDER BY date) AS rn
FROM @t
) Q
WHERE rn > 1
)
要测试......
DECLARE @t TABLE
(
unique_ID INT IDENTITY,
worker_ID INT,
date DATETIME,
type_ID INT
)
INSERT INTO @t VALUES (1, DATEADD(DAY, 1, GETDATE()), 1)
INSERT INTO @t VALUES (1, GETDATE(), 1)
INSERT INTO @t VALUES (2, GETDATE(), 1)
INSERT INTO @t VALUES (1, DATEADD(DAY, 2, GETDATE()), 1)
INSERT INTO @t VALUES (1, DATEADD(DAY, 3, GETDATE()), 2)
SELECT * FROM @t
DELETE FROM @t WHERE unique_Id IN
(
SELECT unique_Id FROM
(
SELECT unique_Id
,Type_Id
,ROW_NUMBER() OVER (PARTITION BY worker_Id, type_Id ORDER BY date) AS rn
FROM @t
) Q
WHERE rn > 1
)
SELECT * FROM @t
答案 3 :(得分:1)
您可以使用此查询
delete from worker where unique_id in (
select max(unique_id) from worker group by worker_ID , type_ID having count(type_id)>1)
这里我假设工人是你的表名