T-SQLでn個ずつのグループにわける

前回はn個のグループにわけるクエリを書いてみました。

ichiroku11.hatenablog.jp

今回はn個ずつになるようにグルーピングするクエリをROW_NUMBER関数を使って書いてみたいと思います。

ROW_NUMBER (Transact-SQL) | Microsoft Docs

前回と同じように11から20までの数値があるとします。

-- 11から20までの数値があるとして
select *
from #Sequence;

/*
Value
-----------
11
12
13
14
15
16
17
18
19
20
*/

この10個の数値を4個ずつのグループ(この場合は4個・4個・2個のグループ)にわかれるようにグループ番号を割り振ります。グループ番号はNTILE関数と同じように1からとしてみます。

-- 4個ずつのグループにわける
declare @count int = 4;

select *,
    -- グループ番号は1からにする
    (row_number() over (order By Value) - 1) / @count + 1 as GroupNo
    -- グループ番号が0からでよければ
    -- (row_number() over (order By Value) - 1) / @count as GroupNo
from #Sequence;

/*
Value       GroupNo
----------- --------------------
11          1
12          1
13          1
14          1
15          2
16          2
17          2
18          2
19          3
20          3
*/

4個ずつのグループにわけることができました。