本文介紹AnalyticDB PostgreSQL版7.0版本支持的GROUPS模式的窗口框架以及Frame exclusion特性。
背景信息
窗口函數是指在和當前行相關的一個窗口上執行計算,對應每一行輸出一個在對應窗口的計算結果的函數。
GROUPS模式的窗口框架
GROUPS模式的窗口框架,支持以組(Group)為單位選取窗口,讓選取窗口的方式不再受限于“RANGE”的值范圍與“ROWS”的行數范圍,更加靈活。例如:選取從該行所在組的上一組到該行所在組的下一組這三組作為窗口。
Frame exclusion特性
Frame exclusion特性支持選擇窗口排除當前行(EXCLUDE CURRENT ROW)、排除當前行所在組(EXCLUDE GROUP)、排除當前行所在組的其他行(EXCLUDE TIES)以及沒有排除規則(EXCLUDE NO OTHERS),能更好得控制當前行與當前組是否在窗口中。
語法
窗口函數的語法,請參考社區文檔。
示例
準備測試表和測試數據,用于窗口函數的查詢測試。
create table test(a int, b int,c int);
其中表test包含如下數據: a | b | c |
----+---+---+
1 | 0 | 0 |
2 | 0 | 1 |
3 | 0 | 1 |
4 | 0 | 2 |
5 | 1 | 2 |
6 | 1 | 3 |
7 | 1 | 3 |
8 | 1 | 4 |
9 | 1 | 4 |
10 | 2 | 5 |
----+---+---+
(10 rows)
- 示例1:以c排序分組后,計算上一組至下一組共三個組的b的和。
返回結果如下:select a,b,c,sum(b) over (order by c groups between 1 PRECEDING and 1 FOLLOWING) from test order by c;
a | b | c | sum ----+---+---+----- 1 | 0 | 0 | 0 2 | 0 | 1 | 1 3 | 0 | 1 | 1 4 | 0 | 2 | 3 5 | 1 | 2 | 3 6 | 1 | 3 | 5 7 | 1 | 3 | 5 8 | 1 | 4 | 6 9 | 1 | 4 | 6 10 | 2 | 5 | 4 ----+---+---+---- (10 rows)
- 示例2: 以c排序分組后,計算上一組數據以及當前組數據(不包含當前行)的b的和。
返回結果如下select a,b,c,sum(b) over (order by c groups between 1 PRECEDING and CURRENT ROW EXCLUDE CURRENT ROW) from test order by c;
a | b | c | sum ----+---+---+----- 1 | 0 | 0 | 2 | 0 | 1 | 0 3 | 0 | 1 | 0 4 | 0 | 2 | 1 5 | 1 | 2 | 0 6 | 1 | 3 | 2 7 | 1 | 3 | 2 8 | 1 | 4 | 3 9 | 1 | 4 | 3 10 | 2 | 5 | 2 ----+---+---+----- (10 rows)
- 示例3:以c排序分組后,計算上一組和下一組共兩組數據的b的和。
返回結果如下:select a,b,c,sum(b) over (order by c groups between 1 PRECEDING and 1 FOLLOWING EXCLUDE GROUP) from test order by c;
a | b | c | sum ----+---+---+----- 1 | 0 | 0 | 0 2 | 0 | 1 | 1 3 | 0 | 1 | 1 4 | 0 | 2 | 2 5 | 1 | 2 | 2 6 | 1 | 3 | 3 7 | 1 | 3 | 3 8 | 1 | 4 | 4 9 | 1 | 4 | 4 10 | 2 | 5 | 2 ----+---+---+----- (10 rows)
- 示例4:以c排序分組后,上一組數據以及當前行數據的b的和。
返回結果如下:select a,b,c,sum(b) over (order by c groups between 1 PRECEDING and CURRENT ROW EXCLUDE TIES) from test order by c;
a | b | c | sum ----+---+---+----- 1 | 0 | 0 | 0 2 | 0 | 1 | 0 3 | 0 | 1 | 0 4 | 0 | 2 | 0 5 | 1 | 2 | 1 6 | 1 | 3 | 2 7 | 1 | 3 | 2 8 | 1 | 4 | 3 9 | 1 | 4 | 3 10 | 2 | 5 | 4 ----+---+---+----- (10 rows)
- 示例5:以c排序分組后,計算上一組數據的b的和。
返回結果如下:select a,b,c,sum(b) over (order by c groups between 1 PRECEDING and 1 PRECEDING EXCLUDE NO OTHERS) from test order by c;
a | b | c | sum ----+---+---+----- 1 | 0 | 0 | 2 | 0 | 1 | 0 3 | 0 | 1 | 0 4 | 0 | 2 | 0 5 | 1 | 2 | 0 6 | 1 | 3 | 1 7 | 1 | 3 | 1 8 | 1 | 4 | 2 9 | 1 | 4 | 2 10 | 2 | 5 | 2 ----+---+---+----- (10 rows)