メインコンテンツまでスキップ

GROUP BY

GROUP BY

説明

GROUP BY GROUPING SETSCUBEROLLUP は、GROUP BY句の拡張です。これにより、GROUP BY句内の複数のセットのグループの集計を実現することができます。結果は、複数の対応するGROUP BY句のUNION演算と同等です。

GROUP BY句は、GROUPING SETSを含む特殊な場合であり、要素が1つの場合です。例えば、次のGROUPING SETS文:

SELECT a, b, SUM( c ) FROM tab1 GROUP BY GROUPING SETS ( (a, b), (a), (b), ( ) );

クエリの結果は、次のクエリと同等です:

SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b
UNION
SELECT a, null, SUM( c ) FROM tab1 GROUP BY a
UNION
SELECT null, b, SUM( c ) FROM tab1 GROUP BY b
UNION
SELECT null, null, SUM( c ) FROM tab1

GROUPING(expr) は、列が集計列かどうかを示します。集計列の場合、0であり、それ以外の場合は1です。

GROUPING_ID(expr [ , expr [ , ... ] ]) はGROUPINGに似ています。GROUPING_IDは指定した列の順序に基づいて列リストのビットマップ値を計算し、各ビットはGROUPINGの値です。

GROUPING_ID() 関数は、ビットベクトルの10進数値を返します。

構文

SELECT ...
FROM ...
[ ... ]
GROUP BY [
, ... |
GROUPING SETS [, ...] ( groupSet [ , groupSet [ , ... ] ] ) |
ROLLUP(expr [ , expr [ , ... ] ]) |
expr [ , expr [ , ... ] ] WITH ROLLUP |
CUBE(expr [ , expr [ , ... ] ]) |
expr [ , expr [ , ... ] ] WITH CUBE
]
[ ... ]

パラメータ

groupSet は、選択リスト内の列、エイリアス、または式で構成されるセットを表します。 groupSet ::= { ( expr [ , expr [ , ... ] ] )}

expr は、選択リスト内の列、エイリアス、または式を示します。

注意

StarRocksはPostgreSQLのような構文をサポートしています。以下に構文の例を示します:

SELECT a, b, SUM( c ) FROM tab1 GROUP BY GROUPING SETS ( (a, b), (a), (b), ( ) );
SELECT a, b,c, SUM( d ) FROM tab1 GROUP BY ROLLUP(a,b,c)
SELECT a, b,c, SUM( d ) FROM tab1 GROUP BY CUBE(a,b,c)

ROLLUP(a,b,c) は以下の GROUPING SETS 文と同等です:

GROUPING SETS (
(a,b,c),
( a, b ),
( a),
( )
)

CUBE(a,b,c) は以下の GROUPING SETS 文と同等です:

GROUPING SETS (
( a, b, c ),
( a, b ),
( a, c ),
( a ),
( b, c ),
( b ),
( c ),
( )
)

以下は実際のデータの例です:

> SELECT * FROM t;
+------+------+------+
| k1 | k2 | k3 |
+------+------+------+
| a | A | 1 |
| a | A | 2 |
| a | B | 1 |
| a | B | 3 |
| b | A | 1 |
| b | A | 4 |
| b | B | 1 |
| b | B | 5 |
+------+------+------+
8 rows in set (0.01 sec)

> SELECT k1, k2, SUM(k3) FROM t GROUP BY GROUPING SETS ( (k1, k2), (k2), (k1), ( ) );
+------+------+-----------+
| k1 | k2 | sum(`k3`) |
+------+------+-----------+
| b | B | 6 |
| a | B | 4 |
| a | A | 3 |
| b | A | 5 |
| NULL | B | 10 |
| NULL | A | 8 |
| a | NULL | 7 |
| b | NULL | 11 |
| NULL | NULL | 18 |
+------+------+-----------+
9 rows in set (0.06 sec)

> SELECT k1, k2, GROUPING_ID(k1,k2), SUM(k3) FROM t GROUP BY GROUPING SETS ((k1, k2), (k1), (k2), ());
+------+------+---------------+----------------+
| k1 | k2 | grouping_id(k1,k2) | sum(`k3`) |
+------+------+---------------+----------------+
| a | A | 0 | 3 |
| a | B | 0 | 4 |
| a | NULL | 1 | 7 |
| b | A | 0 | 5 |
| b | B | 0 | 6 |
| b | NULL | 1 | 11 |
| NULL | A | 2 | 8 |
| NULL | B | 2 | 10 |
| NULL | NULL | 3 | 18 |
+------+------+---------------+----------------+
9 rows in set (0.02 sec)