Skip to content

聚合与窗口函数

聚合函数可以用来将多行数据组合成单个答案。聚合可以通过一个 GROUP BY 子句来完成,在这种情况下,组合值是针对每个唯一的分组键组合计算的。聚合也可以在没有 GROUP BY 子句的情况下完成,在这种情况下,输出一个单一的值,通过计算所有行的聚合得到。

例如:

SELECT AVG(A) FROM table1 GROUP BY B

SELECT COUNT(Distinct A) FROM table1

窗口函数可以用于计算一行及其周围行的聚合。大多数窗口函数具有以下语法:

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 PRECEDINGN FOLLOWING),其中 N 是一个正整数, 或者它们可以是绝对的(即 UNBOUNDED PRECEDINGUNBOUNDED 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
此查询计算了4个总和,并为原始表中的每一行返回1行:

  • S1: 表示整个表中A每行的总和。
  • S2: 每个B分区内A的所有值的总和。
  • S3: 当行按照 B 进行分区并根据 C 进行排序时,每行及其之前所有行的累计和。
  • S4: 在按照 C 排序时,每一行与前后行的总和。

注意

对于大多数窗口函数,如果指定的窗口帧为空或全部为 NULL,BodoSQL 将返回 NULL。对此行为的例外情况已注明。

所有窗口函数可选地允许 PARTITION BY。某些窗口函数可选地允许 ORDER BY,而某些函数可能实际上需要它。某些窗口函数可选地允许窗口框架,而其他函数则禁止使用。如果一个函数支持窗口框架但没有提供,默认框架的行为取决于该函数。

注意

RANGE BETWEEN 目前不受支持。

注意

如果窗口框架包含 NaN 值,输出可能会与 Snowflake 的行为有所不同。当 NaN 值进入窗口时,任何结合算术结果的窗口函数(例如 SUMAVGVARIANCE 等)将在 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