我们有一个流程可以根据一些任意规则创建一个重复记录表(详情不相关)。
每个记录都会针对所有其他记录进行检查,如果发现可疑副本,则将其与副本存储在dupe表中以进行人工审核。
这导致表格如下:
dupId, originalId, duplicateId
1 1 2
2 1 3
3 1 4
4 2 3
5 2 4
6 3 4
7 5 6
8 5 7
9 6 7
10 8 9
你可以在这里看到记录#1有3个与它类似的其他记录(#2,#3和#4),它们各自相似。 记录#5有2个重复(#6和#7),记录#8只有1个(#9)。
我想将重复项查询到集合中,因此我的结果看起来像这样:
setId recordId
1 1
1 2
1 3
1 4
2 5
2 6
2 7
3 8
3 9
但是我太老了/太慢/累了/垃圾,这里有点超出我的深度。
目前,当检查重复项时,如果记录配对已经在表格中,我们不会插入两次(即您不会看到重复配对的两侧)但是如果它没有,则可以轻松地进行使查询更简单。
任何建议都非常感谢!
答案 0 :(得分:3)
重复似乎是传递性的,所以你拥有所有对。也就是说,“原始”ID具有您需要的信息。
但它没有包含在副本中,你想要那样。所以:
select dense_rank() over (order by originalid) as setid, duplicateid
from ((select originalid, duplicateid
from t
where not exists (select 1 from t t2 where t.originalid = t2.duplicateid)
) union all
(select distinct originalid, originalid
from t
where not exists (select 1 from t t2 where t.originalid = t2.duplicateid)
)
) i
order by setid;