GROUP BY子句用于結合聚合函數,根據一個或多個列對分析結果進行分組。GROUP BY子句還支持搭配ROLLUP子句、CUBE子句和GROUPING SETS子句,擴展分組功能。
語法
GROUP BY
分析結果進行分組。
SELECT
key,
...
aggregate function
GROUP BY
key,...
GROUP BY ROLLUP
GROUP BY ROLLUP子句按照匯總分組,支持為每個分組返回一個小計,為所有分組返回一個總計。例如GROUP BY ROLLUP (a, b),結果集為(a, b)、(a, null) 和 (null, null) 。
SELECT
key,
...
aggregate function
GROUP BY ROLLUP (key,...)
GROUP BY CUBE
GROUP BY CUBE子句按照所有可能的列組合進行分組。例如GROUP BY CUBE (a, b),結果集為(a, b)、(null, b)、(a, null) 和 (null, null) 。
SELECT
key,
...
aggregate function
GROUP BY CUBE (key,...)
GROUP BY GROUPING SETS
GROUP BY GROUPING SETS子句按照列依次進行分組。例如GROUP BY GROUPING SETS (a, b),結果集為(a, null)和(null, b)。
SELECT
key,
...
aggregate function
GROUP BY GROUPING SETS (key,...)
在SQL語句中,如果您使用了GROUP BY子句,則在執行SELECT語句時,只能選擇GROUP BY的列或者對任意列進行聚合計算,不允許選擇非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
。
參數說明
參數 | 說明 |
key | 日志字段名稱或聚合函數計算結果列,即支持按照日志字段名稱或聚合函數計算結果列進行分組。 GROUP BY子句支持單列或多列。 |
aggregate function | 聚合函數。GROUP BY子句常與min、max、avg、sum、count等聚合函數搭配使用。更多信息,請參見聚合函數。 |
示例
示例1
統計不同狀態碼對應的請求次數。
查詢和分析語句
* | SELECT status, count(*) AS PV GROUP BY status
查詢和分析結果
示例2
按照每小時的時間粒度計算網站訪問PV。其中,__time__字段為日志服務中的保留字段,表示時間列。time為date_trunc('hour', __time__)
的別名。date_trunc函數的更多信息,請參見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)
查詢和分析結果