學習PG聚合操作機制時,看到ExecInitAgg中初始化時有對AggState中有pergroups等進行初始化[AggState的解釋見上一篇:GreenPlum7聚合操作結構體之間關系
那么什么是pergroups呢,它的作用是什么?
ExecInitAgg中:可以看到組數等于組集合數(若沒hash的話),每個分組中有numaggs個聚集
這里就需要理解什么是grouping sets。
PostgreSQL9.5版本引入了group by的分組集合功能,提供了GROUPING SETS,CUBE,ROLLUP參數。這些新的標準SQL選項可以讓用戶在一次查詢中生成多個不同級別或者多維度的報表,而不是像以前一樣需要幾次查詢。
postgres=# create table t1(id1 int,name varchar(20),class int,score int);
CREATE TABLE
postgres=# select * from t1; id1 | name | class | score
-----+----------+-------+-------
1 | math | 1 | 50
2 | math | 2 | 90
3 | math | 1 | 70
5 | chinese | 1 | 50
6 | chinese | 2 | 60
4 | chinese | 2 | 60
7 | physical | 1 | 90
8 | physical | 2 | 80
(8 行記錄)
首先看下普通的group by:根據name和class字段求和:
可以看到到僅一個聚合分類。那么再看下GROUPING SETS語法:
有3種聚合分類:1)針對name進行分組然后求sum值;2)針對class進行分組,然后求sum值;3)grouping sets種的空,表示所有行都聚合到一個分組中。
需要注意,grouping sets的集合中,一個括號一個分組,如下(name,class)為一個分組。該語句等價于普通的group by。
總結:grouping sets中有一個集合,則有一個聚合;若有2個集合,則2個聚合。
-
SQL
+關注
關注
1文章
768瀏覽量
44177
發布評論請先 登錄
相關推薦
評論