GROUP BY子句
適用於:磚的SQL磚運行時
的集團通過
子句用於根據一組指定的分組表達式對行進行分組,並根據一個或多個指定的聚合函數對行組計算聚合。Databricks SQL還支持高級聚合,以便通過via對同一輸入記錄集進行多個聚合分組集
,多維數據集
,彙總
條款。分組表達式和高級聚合可以混合在集團通過
子句並嵌套在分組集
條款。
在混合/嵌套分組分析一節中查看更多細節。
當一個過濾器
子句附加到聚合函數時,隻有匹配的行被傳遞給該函數。
語法
集團通過group_expression[,...][與彙總|與多維數據集]集團通過{group_expression|{彙總|多維數據集|分組集}(grouping_set[,...])}[,...]grouping_set{表達式|([表達式[,...]])}
而聚合函數定義為
aggregate_name([截然不同的]表達式[,...])[過濾器(在哪裏boolean_expression)]
參數
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.-每個經銷商的“本田思域”和“本田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