OceanBase WINDOW FUNCTION

2021-06-29 17:00 更新

WINDOW FUNCTION 算子用于實(shí)現(xiàn) SQL 中的分析函數(shù)(也叫窗口函數(shù)),計(jì)算窗口下的相關(guān)行的結(jié)果。

窗口函數(shù)與聚集函數(shù)不同的是,聚集函數(shù)一組只能返回一行,而窗口函數(shù)每組可以返回多行,組內(nèi)每一行都是基于窗口的邏輯計(jì)算的結(jié)果。因此,在執(zhí)行含有 WINDOW FUNCTION 的 SQL 時 (格式一般為 OVER(...)),都會在生成執(zhí)行計(jì)劃的時候分配一個 WINDOW FUNCTION 算子。

示例:含 WINDOW FUNCTION 算子的執(zhí)行計(jì)劃

obclient>CREATE TABLE t1(c1 INT, c2 INT);
Query OK, 0 rows affected (0.12 sec)

obclient>INSERT INTO t1 VALUES(1, 1);
Query OK, 1 rows affected (0.12 sec)

obclient>INSERT INTO t1 VALUES(2, 2);
Query OK, 1 rows affected (0.12 sec)

obclient>INSERT INTO t1 VALUES(3, 3);
Query OK, 1 rows affected (0.12 sec)

Q1: 
obclient>EXPLAIN SELECT MAX(c1) OVER(PARTITION BY c1 ORDER BY c2) FROM t1\G;
*************************** 1. row ***************************
Query Plan:
| ========================================
|ID|OPERATOR       |NAME|EST. ROWS|COST|
----------------------------------------
|0 |WINDOW FUNCTION|    |3        |45  |
|1 | SORT          |    |3        |44  |
|2 |  TABLE SCAN   |T1  |3        |37  |
========================================

Outputs & filters: 
-------------------------------------
  0 - output([T_FUN_MAX(T1.C1)]), filter(nil), 
      win_expr(T_FUN_MAX(T1.C1)), partition_by([T1.C1]), order_by([T1.C2, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW)
  1 - output([T1.C1], [T1.C2]), filter(nil), sort_keys([T1.C1, ASC], [T1.C2, ASC])
  2 - output([T1.C1], [T1.C2]), filter(nil), 
      access([T1.C1], [T1.C2]), partitions(p0)

其中,窗口函數(shù)中指定了一個 ORDER BY/PARTITION BY 的時候,會在下層分配一個 SORT 算子,將排序結(jié)果返回給窗口函數(shù)算子使用。

上述示例中,Q1 查詢的執(zhí)行計(jì)劃展示中的 outputs & filters 詳細(xì)列出了 WINDOW FUNCTION 算子的輸出信息如下:

信息名稱

含義

output

該算子輸出的表達(dá)式。

filter

該算子上的過濾條件。

由于示例中 WINDOW FUNCTION 算子沒有設(shè)置 filter,所以為 nil。

win_expr

在窗口中使用何種聚合函數(shù)。

例如,Q1 查詢?yōu)榍?c1 列的最大值,因此為T_FUN_MAX(t1.c1)。

partition_by

在窗口中按照何種方式分組。

例如,Q1 查詢?yōu)榘凑?c1 列分組,因此為 t1.c1

order_by

在窗口中按照何種方式排序。

例如,Q1 查詢?yōu)榘凑?c2 列排序,因此為 t1.c2。

window_type

窗口類型,包括 range 和 rows 兩種:

  • range :按照邏輯位置偏移進(jìn)行計(jì)算窗口上下界限,默認(rèn)使用 range 方式。

  • rows :按照實(shí)際物理位置偏移進(jìn)行計(jì)算窗口上下界限。

例如,Q1 查詢未設(shè)置窗口類型,因此選擇了默認(rèn)方式 range。

upper

設(shè)定窗口的上邊界:

  • UNBOUNDED :無邊界,選擇最大的值(默認(rèn))。

  • CURRENT ROW :從當(dāng)前行開始,如果出現(xiàn)數(shù)字則表示移動的行數(shù)。

  • PRECEDING :向前取邊

  • FOLLOWING:向后取邊界。

例如,Q1 查詢設(shè)置的上邊界為向前無邊界。

lower

設(shè)定窗口的下邊界,邊界屬性設(shè)置同 upper。

例如,Q1 查詢設(shè)置的下邊界為當(dāng)前行。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號