GROUP BY子句
适用于:砖的SQL砖运行时
的集团通过
子句用于根据一组指定的分组表达式对行进行分组,并根据一个或多个指定的聚合函数对行组计算聚合。Databricks SQL还支持高级聚合,以便通过via对同一输入记录集进行多个聚合分组集
,多维数据集
,汇总
条款。分组表达式和高级聚合可以混合在集团通过
子句并嵌套在分组集
条款。
在混合/嵌套分组分析一节中查看更多细节。
当一个过滤器
子句附加到聚合函数时,只有匹配的行被传递给该函数。
语法
集团通过所有集团通过group_expression(,...][与汇总|与多维数据集]集团通过{group_expression|{汇总|多维数据集|分组集}(grouping_set(,...])}(,...]grouping_set{表达式|([表达式(,...]])}
而聚合函数定义为
aggregate_name([截然不同的]表达式(,...])[过滤器(在哪里boolean_expression)]
参数
所有
适用于:Databricks运行时12.1及以上
一个简单的符号来添加所有
选择
-list表达式不包含聚合函数group_expression
s.如果不存在该表达式集团通过所有
等于省略集团通过
子句,该子句导致全局聚合。集团通过所有
不能保证生成一组可解析的组表达式。砖了UNRESOLVED_ALL_IN_GROUP_BY或MISSING_AGGREGATION如果生成的子句不是格式良好的。group_expression
指定将行分组在一起的条件。行分组是根据分组表达式的结果值执行的。分组表达式可以是列名,如
集团通过一个
,列位置为集团通过0
,或者像这样的表达集团通过一个+b
.如果group_expression
包含一个聚合函数Databricks提出了一个GROUP_BY_AGGREGATE错误。grouping_set
分组集由0个或多个括号中以逗号分隔的表达式指定。当分组集只有一个元素时,括号可以省略。例如,
分组集((),(b))
和分组集(一个b)
.分组集
对后面指定的每个分组集的行进行分组
分组集
.例如:集团通过分组集((仓库),(产品)
的结果的并集在语义上等价于集团通过仓库
而且集团通过产品
.这个从句是a的简写
联盟所有
每条腿在哪里联盟所有
操作符中指定的每个分组集执行聚合分组集
条款。同样的,
集团通过分组集(仓库,产品),(产品),())
的结果的并集在语义上等价于集团通过仓库,产品
,集团通过产品
这是全球的总和。
请注意
对于Hive兼容性,Databricks SQL允许集团通过...分组集(…)
.的集团通过
表达式通常会被忽略,但如果它们包含除分组集
表达式,额外的表达式将包含在分组表达式中,且值始终为null。例如,选择一个,b,c从...集团通过一个,b,c分组集(一个b)
,则列c的输出始终为空。
汇总
在单个语句中指定多个级别的聚合。此子句用于基于多个分组集计算聚合。
汇总
是一种简写分组集
.例如:集团通过仓库,产品与汇总
或集团通过汇总(仓库,产品)
等于集团通过分组集(仓库,产品),(仓库),())
.而
集团通过汇总(仓库,产品,(仓库,位置)
等于
集团通过分组集(仓库,产品,位置),(仓库,产品),(仓库),())
.a的N个元素
汇总
规格结果为N+1分组集
.多维数据集
的
多维数据集
子句用于基于中指定的分组列的组合执行聚合集团通过
条款。多维数据集
是一种简写分组集
.例如:集团通过仓库,产品与多维数据集
或集团通过多维数据集(仓库,产品)
等于集团通过分组集(仓库,产品),(仓库),(产品),())
.而
集团通过多维数据集(仓库,产品,(仓库,位置)
等于
集团通过分组集(仓库,产品,位置),(仓库,产品),(仓库,位置),(产品,仓库,位置),(仓库),(产品),(仓库,产品),())
.a的N个元素
多维数据集
规范的结果是2^N分组集
.aggregate_name
一个聚合函数名(MIN, MAX, COUNT, SUM, AVG等)。
截然不同的
在将输入行传递给聚合函数之前删除重复的输入行。
过滤器
属性所对应的输入行进行筛选
boolean_expression
在在哪里
子句的值为true则传递给聚合函数;其他行将被丢弃。
混合/嵌套分组分析
一个集团通过
子句可以包含多个group_expression和多个多维数据集
,汇总
,分组集
年代。
分组集
也可以嵌套多维数据集
,汇总
,或分组集
条款。例如:
分组集(汇总(仓库,位置),多维数据集(仓库,位置),分组集(仓库,分组集(位置,分组集(汇总(仓库,位置),多维数据集(仓库,位置))))
多维数据集
而且汇总
只是语法糖吗分组集
.关于如何翻译,请参考上面的部分多维数据集
而且汇总
来分组集
.group_expression
可以作为单一群体来对待吗分组集
在这种情况下。
为多个分组集
在集团通过
子句,Databricks SQL生成一个单独的分组集
通过对原函数做叉乘分组集
.
嵌套分组集
在分组集
子句,Databricks SQL只是获取它的分组集并剥离它们。例如:
集团通过仓库,分组集((产品),()),分组集(位置,大小),(位置),(尺寸),())
而且
集团通过仓库,汇总(产品),多维数据集(位置,大小)
都相当于集团通过分组集((仓库,产品,的位置,大小),(仓库,产品,位置),(仓库,产品,大小),(仓库,产品),(仓库,的位置,大小),(仓库,位置),(仓库,大小),(仓库)
.
而集团通过分组集(分组集(仓库),分组集(仓库,产品)))
等于集团通过分组集((仓库),(仓库,产品)
.
例子
创建临时视图经销商(id,城市,car_model,数量)作为值(One hundred.,“弗里蒙特”,“本田思域”,10),(One hundred.,“弗里蒙特”,“本田雅阁”,15),(One hundred.,“弗里蒙特”,“本田CRV”,7),(200,“都柏林”,“本田思域”,20.),(200,“都柏林”,“本田雅阁”,10),(200,“都柏林”,“本田CRV”,3.),(300,“圣荷西”,“本田思域”,5),(300,“圣荷西”,“本田雅阁”,8);——每个经销商的数量总和。按“id”分组。>选择id,总和(数量)从经销商集团通过id订单通过id;id总和(数量)--- -------------One hundred.322003330013——在GROUP by子句中使用列位置。>选择id,总和(数量)从经销商集团通过1订单通过1;id总和(数量)--- -------------One hundred.322003330013—多个聚合。——1。每个经销商的数量总和。——2。每个经销商的最大数量。>选择id,总和(数量)作为总和,马克斯(数量)作为马克斯从经销商集团通过id订单通过id;id总和马克斯--- --- ---One hundred.32152003320.300138——计算每个car_model在城市中不同经销商的数量。>选择car_model,数(截然不同的城市)作为数从经销商集团通过car_model;car_model数------------ -----本田公民3.本田CRV2本田协议3.——计算每个car_model在城市中不同经销商的数量,使用GROUP BY ALL>选择car_model,数(截然不同的城市)作为数从经销商集团通过所有;car_model数------------ -----本田公民3.本田CRV2本田协议3.-每个经销商的“本田思域”和“本田CRV”数量之和。>选择id,总和(数量)过滤器(在哪里car_model在(“本田思域”,“本田CRV”))作为`总和(数量)`从经销商集团通过id订单通过id;id总和(数量)--- -------------One hundred.17200233005—在一条语句中使用多组分组列的聚合。——Following基于四组分组列执行聚合。——1。城市,car_model——2。城市——3。car_model——4。空分组集。返回所有城市和汽车模型的数量。>选择城市,car_model,总和(数量)作为总和从经销商集团通过分组集((城市,car_model),(城市),(car_model),())订单通过城市;城市car_model总和--------- ------------ ---零零78零刚刚上市的33零HondaCRV10零HondaCivic35都柏林零33都柏林刚刚上市的10都柏林HondaCRV3.都柏林HondaCivic20.弗里蒙特零32弗里蒙特刚刚上市的15弗里蒙特HondaCRV7弗里蒙特HondaCivic10圣穆零13圣穆刚刚上市的8圣穆HondaCivic5——通过' ROLLUP '子句进行分组处理。——通过GROUPING SETS ((city, car_model), (city),()来等价分组>选择城市,car_model,总和(数量)作为总和从经销商集团通过城市,car_model与汇总订单通过城市,car_model;城市car_model总和--------- ------------ ---零零78都柏林零33都柏林刚刚上市的10都柏林HondaCRV3.都柏林HondaCivic20.弗里蒙特零32弗里蒙特刚刚上市的15弗里蒙特HondaCRV7弗里蒙特HondaCivic10圣穆零13圣穆刚刚上市的8圣穆HondaCivic5——通过' CUBE '子句进行分组。——通过GROUPING SETS ((city, car_model), (city), (car_model), ()>选择城市,car_model,总和(数量)作为总和从经销商集团通过城市,car_model与多维数据集订单通过城市,car_model;城市car_model总和--------- ------------ ---零零78零刚刚上市的33零HondaCRV10零HondaCivic35都柏林零33都柏林刚刚上市的10都柏林HondaCRV3.都柏林HondaCivic20.弗里蒙特零32弗里蒙特刚刚上市的15弗里蒙特HondaCRV7弗里蒙特HondaCivic10圣穆零13圣穆刚刚上市的8圣穆HondaCivic5——为ignore nulls准备数据示例>创建临时视图人(id,的名字,年龄)作为值(One hundred.,“玛丽”,零),(200,“约翰。”,30.),(300,“迈克”,80),(400,“丹”,50);——选择列age中的第一行>选择第一个(年龄)从人;第一个(年龄,假)--------------------零——获取列' age '中的第一行忽略空值,列' id '中的最后一行和列' id '的和。>选择第一个(年龄忽略零位),最后的(id),总和(id)从人;第一个(年龄,真正的)最后的(id,假)总和(id)------------------- ------------------ ----------30.4001000