GROUP BY¶
GROUP BY子句基于指定的列对行进行分组。列的取值相同的行被分为同一组,并对每个组执行聚合计算。
限制条件¶
GROUP BY子句必须跟在至少包含一个聚合函数的 RETURN 语句后面使用。
语法¶
- group_by_clause
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
'''
上述查询执行以下操作:
- 循环读取
users表的每一行数据。 - 按照
id + age两个字段联合分组(两个字段完全相同才算同一组)。 count(*)统计每个分组内的数据行数。- 输出分组后的
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 |
+----------+--------+