GROUP BY子句

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
  • 查询和分析结果group by

示例2

按照每小时的时间粒度计算网站访问PV。其中,__time__字段为日志服务中的保留字段,表示时间列。timedate_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                       
  • 查询和分析结果group by

示例3

按照每5分钟的时间粒度计算PV。

  • 查询和分析语句

    因为date_trunc函数只能按照固定时间间隔统计。如果您需要按照自定义的时间进行统计分析,请按照数学取模方法进行分组。例如%300表示按照5分钟的时间粒度进行取模对齐。

    * |
    SELECT
      count(*) AS PV,
      __time__-__time__ % 300 AS time
    GROUP BY
      time
    LIMIT
      1000
  • 查询和分析结果group by

示例4

根据请求方法和请求状态分组,先计算各个请求方法对应的访问数据,再计算各个请求状态对应的访问数量。

  • 查询和分析语句

    * |
    SELECT
      request_method,
      status,
      count(*) AS PV
    GROUP BY
      GROUPING SETS (request_method, status)
  • 查询和分析结果GROUPING SETS

示例5

根据请求方法和请求状态分组,分组集包括(null, null)、(request_method, null)、(null, status)和(request_method, status),计算以上各个分组的访问数量。

  • 查询和分析语句

    * |
    SELECT
      request_method,
      status,
      count(*) AS PV
    GROUP BY
     CUBE (request_method, status)
  • 查询和分析结果CUBE

示例6

根据请求方法和请求状态分组,分组集包括(request_method, status)、(request_method, null)和(null, null),计算以上各个分组的访问数量。

  • 查询和分析语句

    * |
    SELECT
      request_method,
      status,
      count(*) AS PV
    GROUP BY
     ROLLUP (request_method, status)
  • 查询和分析结果ROLLUP