我有一张表,其中有大约1600万条记录。该表将具有以下结构。
id col a col b col c col d col e col f
1 A b c d e f
1 x y z xx mm kk
1 aa bb dd cc tt ss
2 A b c d e f
2 m n o pp q r
2 aa bb dd cc tt ss
3 A b c d e f
3 x y z xx mm kk
3 aa bb dd cc tt ss
4 A b c d e f
4 x y z xx mm kk
4 aa bb dd cc tt ss
5 A b c d e f
5 m n o pp q r
5 aa bb dd cc tt ss
在上表中,如果比较1,3 4的id字段,除了id之外的所有列值都是相同的。如果id 1下的所有行都与id 2和4中其他列的所有行匹配,我需要将它组合在一起。
所以我的最终结果应该是我将1,3和4映射到一个新的公共ID,将'A'和id 2和5映射到一个新的id'B'。请帮助我以更有效的方式实现这一目标。 它有大量的数据。我已经尝试过使用游标,除了遍历每个id字段,但需要花费很多时间。任何帮助都会很棒。
提前致谢..
答案 0 :(得分:0)
基本上,您可以通过将所有键值连接在一起来形成一个mungo键。这些必须按某种顺序排列,并且连续行值的字母顺序应该是:
select distinct id,
(select ',' + a + ',' + b + ',' + c + ',' + d + ',' + e + ',' + f
from table t2
where t2.id = t.id
order by a + ',' + b + ',' + c + ',' + d + ',' + e + ',' + f
for xml path ('')
) as mungokey
from table t;
你可能想要一些更合理的关键,所以我建议dense_rank()
:
select id, mungokey, dense_rank() over (order by mungokey) as betterkey
from (select distinct id,
(select a + ',' + b + ',' + c + ',' + d + ',' + e + ',' + f
from table t2
where t2.id = t.id
order by a + ',' + b + ',' + c + ',' + d + ',' + e + ',' + f
for xml path ('')
) as mungokey
from table t
) t;