格式、参数
GROUP BY 可以将数据流中的各行数据分成多个组,各组保留一行数据,其余的行舍弃;与聚合运算函数配合使用时,各组产生的聚合值记录在被保留的行中。
语法:
- 格式:group by
<column1>
as<alias1>
,<column2>
as<alias2>
, ... - 参数:(见下表)
- 受影响列:
<column>
及其所有同源列
名称 | 类型 | 规范 | 描述 |
---|---|---|---|
<column> |
NODE,EDGE,PATH,ATTR,ARRAY,TABLE | / | 分组依据,多个依据必须为同源列,从左到右进行多级分组 |
<alias> |
string | 同自定义别名的命名规范 | 分组依据的别名,可省略 |
详解
n(as n1).re().n(as n2) as path
group by n1.shape, n2.color
return path, count(path)
上面 UQL 代码中的 GROUP BY 子句对模板查询得到的一步路径进行分组;先按照起点的形状分组,组内再按照终点的颜色分组;统计各组内的路径数量并返回:
根据 ATTR 分组
示例:对所有银行卡按级别进行分组,并返回每个级别及其对应的卡片数量
find().nodes({@card}) as n
group by n.level as level
return level, count(n)
根据 NODE 分组
示例:查找顾客 CU001、CU002、CU003 持有的银行卡,返回顾客及各自的卡号数组
n({_id in ["CU001","CU002","CU003"]} as n1)
.re({@has}).n({@card} as n2)
group by n1
return n1{*}, collect(n2._id)
多级分组
示例:统计各级别顾客与各级别银行卡之间的持有关系,返回顾客级别、卡片级别、持有数量
n({@customer} as n1)
.re({@has}).n({@card} as n2)
group by n1.level as a, n2.level as b
return table(a, b, count(n2))