GROUP BY
句は、多くの場合、集計関数と共に使用され、1 つ以上の列の値に基づいてクエリ結果の行を分類します。これにより、値の一意の組み合わせごとにサマリー行が作成され、データ分析が向上します。さらに、GROUP BY
は、ROLLUP
、CUBE
、および GROUPING SETS
と組み合わせて、グループ化機能を強化し、より多くの分析オプションを提供できます。
基本構文
GROUP BY
GROUP BY 句は、分析結果をグループ化します。
SELECT
key1,
...
aggregate_function
GROUP BY
key,...
パラメータ:
key1
: 値でグループ化する列。ログフィールド名または集計関数の結果列によるグループ化をサポートします。GROUP BY
句は、単一または複数の列をサポートします。aggregate_function
: 各グループに適用される 集計関数 (count
、min
、max
、avg
、sum
など)。
GROUP BY ROLLUP
GROUP BY ROLLUP
句は、各グループのサマリーとすべてのグループの合計を作成します。たとえば、GROUP BY ROLLUP (a, b)
の結果セットには、(a, b)
、(a, null)
、および (null, null)
が含まれます。
SELECT
key1,
...
aggregate_function
GROUP BY ROLLUP (key1,...)
パラメータ:
key1
: 値でグループ化する列。ログフィールド名または集計関数の結果列によるグループ化をサポートします。GROUP BY
句は、単一または複数の列をサポートします。aggregate_function
: 各グループに適用される 集計関数 (count
、min
、max
、avg
、sum
など)。
GROUP BY CUBE
GROUP BY CUBE
句は、考えられるすべての列の組み合わせでグループ化します。たとえば、GROUP BY CUBE (a, b)
の結果セットには、(a, b)
、(null, b)
、(a, null)
、および (null, null)
が含まれます。
SELECT
key1,
...
aggregate_function
GROUP BY CUBE (key1,...)
パラメータ:
key1
: 値でグループ化する列。ログフィールド名または集計関数の結果列によるグループ化をサポートします。GROUP BY
句は、単一または複数の列をサポートします。aggregate_function
: 各グループに適用される 集計関数 (count
、min
、max
、avg
、sum
など)。
GROUP BY GROUPING SETS
GROUP BY GROUPING SETS
句は、列を順番にグループ化します。たとえば、GROUP BY GROUPING SETS (a, b)
の結果セットには、(a, null)
と (null, b)
が含まれます。
SELECT
key1,
...
aggregate_function
GROUP BY GROUPING SETS (key1,...)
パラメータ:
key1
: 値でグループ化する列。ログフィールド名または集計関数の結果列によるグループ化をサポートします。GROUP BY
句は、単一または複数の列をサポートします。aggregate_function
: 各グループに適用される 集計関数 (count
、min
、max
、avg
、sum
など)。
例
SQL 文では、GROUP BY
句を使用する場合、SELECT
文では以下のみを選択できます。
GROUP BY
句で指定された列。任意の列に対する集計計算の結果 (たとえば、
COUNT()
、SUM()
など)。
GROUP BY
句に含まれていない列を直接選択することは許可されていません。これは、グループ化後にそれらの値が一意ではなくなり、あいまいさが生じる可能性があるためです。たとえば、次の文は無効です。
* | SELECT status, request_time, COUNT(*) AS PV GROUP BY status
これは、request_time
が GROUP BY
句の一部ではなく、集計されていないためです。
正しい形式は次のとおりです。
* | SELECT status, arbitrary(request_time), COUNT(*) AS PV GROUP BY status
arbitrary(request_time)
は、request_time
を集計する方法であり、各グループからランダムな request_time
値が選択されることを示します。このアプローチは、SQL 構文規則に準拠し、クエリ要件を満たしています。
例 1: 状態コード別にページビュー (PV) をカウントする
クエリ文
* | SELECT status, count(*) AS PV GROUP BY status
クエリ結果
例 2: ウェブサイトアクセスの 1 時間ごとの PV をカウントする
クエリ文
__time__
フィールドは、Simple Log Service の予約フィールドであり、時間列を表します。time
はdate_trunc('hour', __time__)
のエイリアスです。詳細については、「date_trunc 関数」をご参照ください。* | SELECT count(*) AS PV, date_trunc('hour', __time__) AS time GROUP BY time ORDER BY time LIMIT 1000
クエリ結果
例 3: 5 分間隔で PV をカウントする
クエリ文
date_trunc
関数は一定の間隔でカウントするため、カスタムの時間ベースの統計分析に剰余演算を使用できます。たとえば、%300
は、データを 5 分間隔でグループ化するための剰余演算を表します。* | SELECT count(*) AS PV, __time__-__time__ % 300 AS time GROUP BY time LIMIT 1000
クエリ結果
例 4: リクエストメソッドとステータス別にグループ化し、各メソッドのアクセスデータと各ステータスのカウントを計算する
クエリ文
* | SELECT request_method, status, count(*) AS PV GROUP BY GROUPING SETS (request_method, status)
クエリ結果
例 5: セット
(null, null)
、(request_method, null)
、(null, status)
、および(request_method, status)
を使用してリクエストメソッドとステータス別にグループ化し、各グループのアクセス数を計算するクエリ文
* | SELECT request_method, status, count(*) AS PV GROUP BY CUBE (request_method, status)
クエリ結果
例 6: セット
(request_method, status)
、(request_method, null)
、および(null, null)
を使用してリクエストメソッドとステータス別にグループ化し、各グループのアクセス数を計算するクエリ文
* | SELECT request_method, status, count(*) AS PV GROUP BY ROLLUP (request_method, status)
クエリ結果