WINDOW FUNCTION 算子用于实现 SQL 中的分析函数(也叫窗口函数),计算窗口下的相关行的结果。
窗口函数与聚集函数不同的是,聚集函数一组只能返回一行,而窗口函数每组可以返回多行,组内每一行都是基于窗口的逻辑计算的结果。因此,在执行含有 WINDOW FUNCTION 的 SQL 时 (格式一般为 OVER(...)
),都会在生成执行计划的时候分配一个 WINDOW FUNCTION 算子。
示例:含 WINDOW FUNCTION 算子的执行计划
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 t1G;
*************************** 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)
其中,窗口函数中指定了一个 ORDER BY/PARTITION BY 的时候,会在下层分配一个 SORT 算子,将排序结果返回给窗口函数算子使用。
上述示例中,Q1 查询的执行计划展示中的 outputs & filters 详细列出了 WINDOW FUNCTION 算子的输出信息如下:
信息名称 |
含义 |
---|---|
output |
该算子输出的表达式。 |
filter |
该算子上的过滤条件。 由于示例中 WINDOW FUNCTION 算子没有设置 filter,所以为 nil。 |
win_expr |
在窗口中使用何种聚合函数。 例如,Q1 查询为求 c1 列的最大值,因此为 |
partition_by |
在窗口中按照何种方式分组。 例如,Q1 查询为按照 c1 列分组,因此为 |
order_by |
在窗口中按照何种方式排序。 例如,Q1 查询为按照 c2 列排序,因此为 |
window_type |
窗口类型,包括 range 和 rows 两种:
例如,Q1 查询未设置窗口类型,因此选择了默认方式 range。 |
upper |
设定窗口的上边界:
例如,Q1 查询设置的上边界为向前无边界。 |
lower |
设定窗口的下边界,边界属性设置同 upper。 例如,Q1 查询设置的下边界为当前行。 |
参数化过程是指把 SQL 查询中的常量变成变量的过程。同一条 SQL 语句在每次执行时可能会使用不同的参数,将这些参数做参数化处理...
SocketImplFactorypublic interface SocketImplFactory该接口为套接字实现定义了一个工厂。 Socket 和 ServerSocket 类使用它来...
SocketAddressjava.lang.Object |---java.net.SocketAddresspublic abstract class SocketAddressextends Objectimplements Seri...
URLDecoderjava.lang.Object |---java.net.URLDecoderpublic class URLDecoderextends ObjectHTML 表单解码的实用程序类。 此类...
Collectionsjava.lang.Object |---java.util.Collectionspublic class Collectionsextends Object此类仅由对集合进行操作或返回...
模板WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用。定义模板使用name属性,作为模板的名字。然后...
绘图接口和方法canvasContext.beginPath定义开始创建一个路径,需要调用fill或者stroke才会使用路径进行填充或描边。Tip: 在最开...
wx.openSetting(OBJECT)基础库版本 1.1.0 开始支持,低版本需做兼容处理调起客户端小程序设置界面,返回用户设置的操作结果Objec...
9.30.1. 检查MCV列表 PostgreSQL提供了一个函数来检查使用CREATE STATISTICS命令定义的复杂统计。9.30.1.检查MCV列表pg_mcv_list...
9.16.1. 处理和创建JSON数据9.16.2. SQL/JSON 路径语言本节描述:用于处理和创建JSON数据的函数和运算器SQL/JSON路径语言要了解有...