本文介紹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)