比较同一个表中的多组行 - 批量记录所需的有效方法-sql

时间:2015-09-04 02:22:02

标签: sql sql-server sql-server-2008-r2

我有一张表,其中有大约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字段,但需要花费很多时间。任何帮助都会很棒。

提前致谢..

1 个答案:

答案 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;