我有一个表“冲突”,其中包含两个进程ID (processIDA int,ProcessIDB int)。
当两个进程(A/B或B/A)被输入到这个“冲突”表中时,就定义了唯一的冲突。
冲突表包含以下重复项:
行.1 ProcessIDA=5 ProcessIDB=6
2 ProcessIDB=6,ProcessIDA=5
我需要做的是过滤掉重复的冲突,以便只剩下:
行.1 ProcessIDB=6 ProcessIDA=5
注意:这个表的行可以在500万到5000万条记录之间变化。一旦我成功地过滤掉了副本,行的数量将正好是当前的一半。
发布于 2015-10-12 10:14:59
如果要删除副本,则
查询
;with cte as
(
select *,
case when ProcessIDA < ProcessIDB
then ProcessIDA else ProcessIDB end as column1,
case when ProcessIDA < ProcessIDB
then ProcessIDB else ProcessIDA end as column2
from conflicts
),
cte2 as
(
select rn = row_number() over
(
partition by cte.column1,cte.column2
order by cte.column1
),*
from cte
)
delete from cte2
where rn > 1;SQL Fiddle
发布于 2015-10-12 09:57:13
你可以做一个简单的自我连接
;WITH Conflicts AS
(
SELECT *
FROM ( VALUES
(6, 5),
(5, 6),
(1, 2),
(1, 3)
) Sample (ProcessIDA, ProcessIDB)
)
SELECT A.*
FROM Conflicts A
JOIN Conflicts B
ON A.ProcessIDA = B.ProcessIDB AND
A.ProcessIDB = B.ProcessIDAhttps://stackoverflow.com/questions/33078178
复制相似问题