跳转至
开发版采用单机部署,无需产品 License 文件。需要多机部署或大规模性能测试? 了解企业版

GROUP BY

GROUP BY子句基于指定的列对行进行分组。列的取值相同的行被分为同一组,并对每个组执行聚合计算。

限制条件

GROUP BY子句必须跟在至少包含一个聚合函数的 RETURN 语句后面使用。

语法

group_by_clause
GROUP BY () variable_value_expression ,

group_by_clause ::=
    'GROUP BY' ( '()' | variable_value_expression ( ',' variable_value_expression )* )

参数

variable_value_expression

用于指定分组所依据的列的变量。更多信息,请参见变量表达式。

()

表示将所有行分为同一组。

示例

基于单列分组

'''
FOR i IN LIST[1,2,3,4,2,2] 
RETURN i, i+1 AS i_1, i+2 AS i_2, count(*) 
GROUP BY i
'''

上述查询将列表中的数字进行分组,使用聚合函数count(*)统计列表中每个唯一值出现的次数,并执行计算。

返回:

+---+-----+-----+----------+
| i | i_1 | i_2 | count(*) |
+---+-----+-----+----------+
| 1 | 2   | 3   | 1        |
| 2 | 3   | 4   | 3        |
| 3 | 4   | 5   | 1        |
| 4 | 5   | 6   | 1        |
+---+-----+-----+----------+

基于带别名的列分组

'''
TABLE users TYPED TABLE {id INT, name STRING} =
    (199, "Julie Kavner"),
    (198, "Tom Cruise"),
    (198, "Amy Hasegawa")
FOR r IN users
RETURN r.id AS id, count(*) AS cnt
GROUP BY id
'''

上述查询将所有id相同的人分为一组,并统计其数量。

返回:

+-----+-----+
| id  | cnt |
+-----+-----+
| 199 | 1   |
| 198 | 2   |
+-----+-----+

基于多列分组

'''
TABLE users TYPED TABLE {id INT, name STRING, age INT} =
    (199, "Julie Kavner", 30),
    (198, "Tom Cruise", 25),
    (198, "Amy Hasegawa", 25),
    (199, "Chris Evans", 30)
FOR r IN users
RETURN r.id AS id, r.age AS age, count(*) AS cnt
GROUP BY id, age 
'''

上述查询执行以下操作:

  1. 循环读取users表的每一行数据。
  2. 按照id + age两个字段联合分组(两个字段完全相同才算同一组)。
  3. count(*)统计每个分组内的数据行数。
  4. 输出分组后的id、age和统计值cnt。

返回:

+-----+-----+-----+
| id  | age | cnt |
+-----+-----+-----+
| 199 | 30  | 2   |
| 198 | 25  | 2   |
+-----+-----+-----+

将所有行分为一个组

'''
FOR i in LIST[1,2,3,4,2,2] 
RETURN count(*), sum(i) 
GROUP BY ()
'''

上述查询将所有行分为同一组,然后执行聚合计算。

返回:

+----------+--------+
| count(*) | sum(i) |
+----------+--------+
| 6        | 14     |
+----------+--------+