1

テーブル内の値の一意の組み合わせごとに一意の番号を追加したいと思います。

サンプルデータ:

create table tmp (
   id int primary key,
   a varchar,
   b varchar,
   c varchar,
   d varchar,
   f int
);

insert into tmp values (1,'a','b','e','h',1);
insert into tmp values (2,'a','b','e','h',2);
insert into tmp values (3,'a','b','e','h',3);
insert into tmp values (4,'b','c','f','i',2);
insert into tmp values (5,'b','c','f','i',1);
insert into tmp values (6,'b','c','f','i',2);
insert into tmp values (7,'c','d','g','j',3);
insert into tmp values (8,'c','d','g','j',1);
insert into tmp values (9,'c','d','g','j',2);

ここで、列のすべての一意の組み合わせに番号を割り当て、列と(グループ識別子)a, b, c, dを返す必要があります。idgid

出力例 (たとえば、ID 1、2 3 の行には列の組み合わせが同じでa, b, c, dあるため、これらの行には同じグループ ID が必要です):

id;gid
1;2
2;2
3;2
4;3
5;3
6;3
7;1
8;1
9;1

私は次の解決策を見つけましたが、より良い(そしてより速い)方法があるはずです:

select 
   id,
   gid
from 
   tmp
   join (
      select 
         a, b, c, d, row_number() over() as gid 
      from 
         tmp 
      group by 
         a, b, c, d) gids using (a, b, c, d)

SQLフィドル

4

1 に答える 1