GROUP_ID() 関数は、GROUP BY の拡張機能(例:ROLLUP、CUBE、GROUPING SETS)によって生成された各重複グループにシーケンス番号を割り当てます。複雑な集約クエリにおいて、重複するグループ化を特定し、フィルター処理するために使用します。
説明
GROUP BY 拡張は、単一の結果セット内に重複するグループを生成する可能性があります。GROUP_ID() は、重複するグループの各発生に 0 から始まる番号を付ける整数を返します。グループが *n* 回出現する場合、その各発生には 0 から n-1 までの値が割り当てられます。
GROUP_ID() は、SELECT 文のうち、GROUP BY 句を含むものにのみ適用されます。
| 出現順 | GROUP_ID の値 |
|---|---|
| 最初 | 0 |
| 2 回目 | 1 |
| 3 回目 | 2 |
| … | … |
使用例
以下のテーブルを使用した例を示します。
a | b | c
---+---+---
1 | 2 | 3重複グループがない場合
GROUP BY ROLLUP(a, b, c) は、(a, b, c)、(a, b)、(a)、() の 4 つの異なるグループを生成します。重複は存在しないため、すべての行で GROUP_ID() の値は 0 になります。
SELECT a, b, c, grouping(a, b, c), group_id()
FROM t
GROUP BY ROLLUP(a, b, c)
ORDER BY grouping(a, b, c);実行結果:
a | b | c | grouping | group_id
---+---+---+----------+----------
1 | 2 | 3 | 0 | 0
1 | 2 | | 1 | 0
1 | | | 3 | 0
| | | 7 | 0
(4 rows)重複グループがある場合
GROUP BY ROLLUP(a, b, c), a, b は同様に 4 行を生成しますが、a, b を GROUP BY 句に追加することで、(a, b) グループが 3 回出現します。GROUP_ID() はこの重複を 0、1、2 の順に番号付けします。
SELECT a, b, c, grouping(a, b, c), group_id()
FROM t
GROUP BY ROLLUP(a, b, c), a, b
ORDER BY grouping(a, b, c);実行結果:
a | b | c | grouping | group_id
---+---+---+----------+----------
1 | 2 | 3 | 0 | 0
1 | 2 | | 1 | 0
1 | 2 | | 1 | 1
1 | 2 | | 1 | 2
(4 rows)