Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/clauses/group-by/ Documentation version: v5.3.2 # GROUP BY `GROUP BY`子句基于指定的列对行进行分组。列的取值相同的行被分为同一组,并对每个组执行聚合计算。 ## 限制条件 `GROUP BY`子句必须跟在至少包含一个[聚合函数](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/functions/aggregate/)的 [RETURN 语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/return/)后面使用。 ## 语法 语法图源码 group_by_clause ```` group_by_clause ::= 'GROUP BY' ( '()' | variable_value_expression ( ',' variable_value_expression )* ) ```` ## 参数 ### `variable_value_expression` 用于指定分组所依据的列的变量。更多信息,请参见[变量表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/binding-variable/)。 ### `()` 表示将所有行分为同一组。 ## 示例 ### 基于单列分组 ```` ''' 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 | +----------+--------+ ````