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)
查询和分析结果