You need to enable JavaScript to run this app.
导航
窗口函数
最近更新时间:2024.11.25 12:55:25首次发布时间:2022.02.28 12:33:07

ByteHouse 支持窗口函数的标准语法。下面解释了与窗口相关的功能列表。

特性

状态

ROWS mode

支持

RANGE mode

支持 (默认)

GROUPS mode

支持

Expressions involving window function like:

支持

Use of aggregate functions in window

支持

Navigations functions:

支持rank, dense_rank, percent_rank, cume_dist, ntile, nth_value, row_number, lagInFrame, leadInFrame, nonNegativeDerivative, lag, lead, first_value, last_value

Window alias like:

支持

  • ANSI / MySQL方言和Clickhouse下对peer group的定义不同,详情参考ANSI部分

row_number()

返回当前分区内行的编号。行从1开始编号,按照窗口定义中的 ORDER BY 子句的顺序排列,如果没有 ORDER BY 子句,则按任意顺序排列。

rank()

返回每组中第一个同级行的编号,当前行的排名会有间隔。如果没有 ORDER BY 子句,则所有行都被视为同级行,此函数总是返回 1。

dense_rank()

返回当前行在其分区内的同级组的编号,排名没有间隔。行从1开始编号,按照窗口定义中的 ORDER BY 子句的顺序排列。如果没有 ORDER BY 子句,则所有行都被视为同级行,此函数总是返回 1。

percent_rank()

尽管名字如此,此函数总是返回介于 0.0 和 1.0 之间的值,计算公式为 (rank - 1)/(partition-rows - 1),其中 rank 是内置窗口函数 rank() 返回的值,partition-rows 是分区中的总行数。如果分区中只有一行,此函数返回 0.0。

cume_dist()

累积分布。计算公式为 row-number/partition-rows,其中 row-number 是 row_number() 函数为组中最后一个同级行返回的值,partition-rows 是分区中的行数。

ntile(N)

参数 N 被视为整数。此函数将分区尽可能均匀地分成 N 组,并按 ORDER BY 子句定义的顺序分配一个介于 1 和 N 之间的整数给每组,否则按任意顺序分配。如果有必要,较大的组会先出现。此函数返回当前行所属组的整数值。

lag(expr) / lag(expr, offset) / lag(expr, offset, default)

lag() 函数的第一种形式返回在分区中上一行计算表达式 expr 的结果。或者,如果没有上一行(因为当前行是第一行),则返回 NULL。
如果提供了 offset 参数,则它必须是非负整数。在这种情况下,返回的值是分区中当前行之前 offset 行计算表达式 expr 的结果。如果 offset 为 0,则对当前行计算 expr。如果当前行之前没有 offset 行,则返回 NULL。
如果还提供了 default 参数,则如果 offset 指定的行不存在,返回 default 而不是 NULL。
对比lagInFrame, lag函数下用户提供的Frame定义被忽略,使用默认的rows between unbounded preceding and unbounded following

lead(expr) / lead(expr, offset) / lead(expr, offset, default)

lead() 函数的第一种形式返回在分区中下一行计算表达式 expr 的结果。或者,如果没有下一行(因为当前行是最后一行),则返回 NULL。
如果提供了 offset 参数,则它必须是非负整数。在这种情况下,返回的值是分区中当前行之后 offset 行计算表达式 expr 的结果。如果 offset 为 0,则对当前行计算 expr。如果当前行之后没有 offset 行,则返回 NULL。
如果还提供了 default 参数,则如果 offset 指定的行不存在,返回 default 而不是 NULL。
对比leadInFrame, lead函数下用户提供的Frame定义被忽略,使用默认的rows between unbounded preceding and unbounded following

first_value(expr)

此内置窗口函数为每行计算窗口框架的方式与聚合窗口函数相同。它返回在窗口框架的第一行计算表达式 expr 的结果。

last_value(expr)

此内置窗口函数为每行计算窗口框架的方式与聚合窗口函数相同。它返回在窗口框架的最后一行计算表达式 expr 的结果。

nth_value(expr, N)

此内置窗口函数为每行计算窗口框架的方式与聚合窗口函数相同。它返回在窗口框架的第 N 行计算表达式 expr 的结果。行在窗口框架内从 1 开始编号,按照 ORDER BY 子句定义的顺序排列(如果有)。如果分区中没有第 N 行,则返回 NULL。

lagInFrame(expr) / lagInFrame(expr, offset) / lagInFrame(expr, offset, default)

lagInFrame 函数的第一种形式返回在窗口框架中前一行计算表达式 expr 的结果。或者,如果没有前一行(因为当前行是第一行),则返回 NULL
如果提供了 offset 参数,则它必须是非负整数。在这种情况下,返回的值是窗口框架中当前行之前 offset 行计算表达式 expr 的结果。如果 offset 为 0,则对当前行计算 expr。如果当前行之前没有 offset 行,则返回 NULL
如果还提供了 default 参数,则如果 offset 指定的行不存在,返回 default 而不是 NULL

leadInFrame(expr) / leadInFrame(expr, offset) / leadInFrame(expr, offset, default)

leadInFrame 函数的第一种形式返回在窗口框架中下一行计算表达式 expr 的结果。或者,如果没有下一行(因为当前行是最后一行),则返回 NULL
如果提供了 offset 参数,则它必须是非负整数。在这种情况下,返回的值是窗口框架中当前行之后 offset 行计算表达式 expr 的结果。如果 offset 为 0,则对当前行计算 expr。如果当前行之后没有 offset 行,则返回 NULL
如果还提供了 default 参数,则如果 offset 指定的行不存在,返回 default 而不是 NULL

nonNegativeDerivative(value)

nonNegativeDerivative 函数计算输入序列 value 中相邻值之间的差值,但不会返回负值。具体而言,如果相邻两个值的差值为正,则返回该差值;如果为负或零,则返回零。
此函数常用于处理时间序列数据,尤其是当数据表示累积计数器时,它能有效地处理计数器重置情况。