语法:GROUP BY a,b WITH CUBE。
作用:根据Group BY维度的所有可能组合进行聚合。类似于Apache Kylin的Cube多维立方体概念。n个维度会有2的n次方种组合。
select departmentid,classid,sum(math) as sumMath,count(distinct studentid) as uv
from student_scores groupby departmentid,classid with cube;
结果
departmentid classid summath uv
NULL NULL 1654 20
NULL class1 930 11
NULL class2 724 9
department1 NULL 718 9
department1 class1 410 5
department1 class2 308 4
department2 NULL 936 11
department2 class1 520 6
department2 class2 416 5
等价于union all:
-- 0个维度-没有维度selectnullas departmentid,null classid,sum(math) as sumMath,count(distinct studentid) as uv
from student_scores
unionall
-- 1个维度-classid
selectnullas departmentid,classid,sum(math) as sumMath,count(distinct studentid) as uv
from student_scores groupby classid
unionall
-- 1个维度-departmentid
select departmentid,nullas classid,sum(math) as sumMath,count(distinct studentid) as uv
from student_scores groupby departmentid
unionall
-- 2个维度-departmentid、classid
select departmentid,classid,sum(math) as sumMath,count(distinct studentid) as uv
from student_scores groupby departmentid,classid;
Grouping Sets 指定维度聚合
语法:GROUP BY a,b GROUPING SETS (a,b)
作用:根据GROUPING SETS指定维度组合进行聚合。是Cube的一部分。Grouping Sets 分组(Grouping) 集(Sets),是多个分组的并集。等价于Union ALL单个分组结果。如grouping sets(A,B) 等价于...group by null,B union all ...group by A,null。
select departmentid,classid,sum(math) as sumMath,count(distinct studentid) as uv
from student_scores
groupby departmentid,classid grouping sets((departmentid,classid),departmentid);
结果:
departmentid classid summath uv
department1 NULL 718 9
department1 class1 410 5
department1 class2 308 4
department2 NULL 936 11
department2 class1 520 6
department2 class2 416 5
等价于union all:
select departmentid,classid,sum(math) as sumMath,count(distinct studentid) as uv
from student_scores
groupby departmentid,classid
unionallselect departmentid,nullas classid,sum(math) as sumMath,count(distinct studentid) as uv
from student_scores
groupby departmentid,null;
With Rollup 层级维度聚合
语法:GROUP BY a,b,c WITH ROLLUP
作用:以GROUP BY最左侧的维度为主,从该维度的角度去上卷、下钻。是Cube的一部分。
select departmentid,classid,sum(math) as sumMath,count(distinct studentid) as uv
from student_scores groupby departmentid,classid with rollup;
结果
departmentid classid summath uv
NULL NULL 1654 20
department1 NULL 718 9
department1 class1 410 5
department1 class2 308 4
department2 NULL 936 11
department2 class1 520 6
department2 class2 416 5
等价于union all:
-- 下钻select departmentid,classid,sum(math) as sumMath,count(distinct studentid) as uv from student_scores
groupby departmentid,classid
unionallselect departmentid,nullas classid,sum(math) as sumMath,count(distinct studentid) as uv from student_scores
groupby departmentid,null
-- 上卷
unionallselectnullas departmentid,nullas classid,sum(math) as sumMath,count(distinct studentid) as uv from student_scores
groupbynull,null;