聚合与窗口函数¶
聚合函数可以用来将多行数据组合成单个答案。聚合可以通过一个 GROUP BY 子句来完成,在这种情况下,组合值是针对每个唯一的分组键组合计算的。聚合也可以在没有 GROUP BY 子句的情况下完成,在这种情况下,输出一个单一的值,通过计算所有行的聚合得到。
例如:
窗口函数可以用于计算一行及其周围行的聚合。大多数窗口函数具有以下语法:
SELECT WINDOW_FN(ARG1, ..., ARGN) OVER (PARTITION BY PARTITION_COLUMN_1, ..., PARTITION_COLUMN_N ORDER BY SORT_COLUMN_1, ..., SORT_COLUMN_N ROWS BETWEEN <LOWER_BOUND> AND <UPPER_BOUND>) FROM table_name
ROWS BETWEEN ROWS BETWEEN <LOWER_BOUND> AND <UPPER_BOUND>
部分是窗口的“框架”,用于指定计算该
函数的窗口。边界可以在当前行之前,使用 PRECEDING 或在当前行之后,使用
FOLLOWING。边界可以是相对的(即
N PRECEDING 或 N FOLLOWING),其中 N 是一个正整数,
或者它们可以是绝对的(即 UNBOUNDED PRECEDING 或
UNBOUNDED FOLLOWING)。
例如,考虑以下窗口函数调用:
SELECT
SUM(A) OVER () as S1,
SUM(A) OVER (PARTITION BY B) as S2,
SUM(A) OVER (PARTITION BY B ORDER BY C ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as S3,
SUM(A) OVER (ORDER BY C ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as S4,
FROM table1
S1: 表示整个表中A每行的总和。S2: 每个B分区内A的所有值的总和。S3: 当行按照 B 进行分区并根据 C 进行排序时,每行及其之前所有行的累计和。S4: 在按照 C 排序时,每一行与前后行的总和。
注意
对于大多数窗口函数,如果指定的窗口帧为空或全部为 NULL,BodoSQL 将返回 NULL。对此行为的例外情况已注明。
所有窗口函数可选地允许 PARTITION BY。某些窗口函数可选地允许 ORDER BY,而某些函数可能实际上需要它。某些窗口函数可选地允许窗口框架,而其他函数则禁止使用。如果一个函数支持窗口框架但没有提供,默认框架的行为取决于该函数。
注意
RANGE BETWEEN 目前不受支持。
注意
如果窗口框架包含 NaN 值,输出可能会与 Snowflake 的行为有所不同。当 NaN 值进入窗口时,任何结合算术结果的窗口函数(例如 SUM、AVG、VARIANCE 等)将在 NaN 值退出窗口之前输出 NaN。
BodoSQL 目前支持以下聚合和窗口函数:
| 函数 | 支持使用 GROUP BY 吗? | 支持不使用 GROUP BY 吗? | 支持作为窗口函数吗? | (窗口) 需要 ORDER BY 吗? | (窗口) 允许帧吗? |
|---|---|---|---|---|---|
ANY_VALUE |
是 | 是 | 是 | 否 | 否 |
APPROX_PERCENTILE |
N | 是 | 是 | 否 | 否 |
ARRAY_AGG |
是 | 否 | 否 | 不适用 | 不适用 |
ARRAY_UNIQUE_AGG |
是 | 否 | 否 | 不适用 | 不适用 |
AVG |
是 | 是 | 是 | 否 | 是 |
BITAND_AGG |
是 | 是 | 是 | 否 | 否 |
BITOR_AGG |
是 | 是 | 是 | 否 | 否 |
BITXOR_AGG |
是 | 是 | 是 | 否 | 否 |
BOOLAND_AGG |
是 | 是 | 是 | 否 | 否 |
BOOLOR_AGG |
是 | 是 | 是 | 否 | 否 |
BOOLXOR_AGG |
是 | 是 | 是 | 否 | 否 |
CONDITIONAL_CHANGE_EVENT |
N | N | 是 | 是 | N |
CONDITIONAL_TRUE_EVENT |
N | N | 是 | 是 | N |
CORR |
不 | 不 | 是 | 不 | 不 |
COUNT |
是 | 是 | 是 | 否 | 是 |
COUNT(*) |
是 | 是 | 是 | 否 | 是 |
COUNT_IF |
是 | 是 | 是 | 否 | 是 |
COVAR_POP |
N | N | 是 | N | N |
COVAR_SAMP |
不需要 | 不需要 | 需要 | 不需要 | 不需要 |
CUME_DIST |
N | N | 是 | 是 | N |
DENSE_RANK |
否 | 否 | 是 | 是 | 否 |
FIRST_VALUE |
否 | 否 | 是 | 否 | 是 |
KURTOSIS |
是 | 是 | 是 | 否 | 否 |
LEAD |
否 | 否 | 是 | 是 | 否 |
LAST_VALUE |
否 | 否 | 是 | 否 | 是 |
LAG |
N | N | 是 | 是 | N |
LISTAGG |
是 | 是 | 否 | 不适用 | 不适用 |
MAX |
是 | 是 | 是 | 否 | 是 |
MEDIAN |
是 | 是 | 是 | 否 | 否 |
MIN |
是 | 是 | 是 | 否 | 是 |
MODE |
是 | 否 | 是 | 否 | 否 |
NTH_VALUE |
N | N | 是 | N | 是 |
NTILE |
N | N | 是 | 是 | 否 |
OBJECT_AGG |
是 | 否 | 是 | 否 | 否 |
PERCENTILE_CONT |
是 | 是 | 否 | 不适用 | 不适用 |
PERCENTILE_DISC |
是 | 是 | 否 | 不适用 | 不适用 |
PERCENT_RANK |
N | N | 是 | 是 | N |
RANK |
无 | 无 | 是 | 是 | 无 |
RATIO_TO_REPORT |
否 | 否 | 是 | 否 | 否 |
ROW_NUMBER |
N | N | 是 | 是 | N |
SKEW |
是 | 是 | 是 | 否 | 否 |
STDDEV |
是 | 是 | 是 | 否 | 是 |
STDDEV_POP |
是 | 是 | 是 | 否 | 是 |
STDDEV_SAMP |
是 | 是 | 是 | 否 | 是 |
SUM |
是 | 是 | 是 | 否 | 是 |
VARIANCE |
是 | 是 | 是 | 否 | 是 |
VARIANCE_POP |
是 | 是 | 是 | 否 | 是 |
VARIANCE_SAMP |
是 | 是 | 是 | 否 | 是 |
VAR_POP |
是 | 是 | 是 | 否 | 是 |
VAR_SAMP |
是 | 是 | 是 | 否 | 是 |