跳到主要内容
跳到主要内容

first_value

它是 any 的别名,但它是为了与 窗口函数 兼容而引入的,在窗口函数中,有时需要处理 NULL 值(默认情况下,所有 ClickHouse 聚合函数都会忽略 NULL 值)。

它支持声明一个修饰符来尊重 null 值(RESPECT NULLS),在 窗口函数 和正常聚合中都支持。

any 一样,如果没有窗口函数,如果源流未排序且返回类型与输入类型匹配(仅当输入为 Nullable 或添加了 -OrNull 组合器时才返回 Null),则结果将是随机的。

示例

CREATE TABLE test_data
(
a Int64,
b Nullable(Int64)
)
ENGINE = Memory;

INSERT INTO test_data (a, b) Values (1,null), (2,3), (4, 5), (6,null);

示例 1

默认情况下,NULL 值会被忽略。

select first_value(b) from test_data;
┌─any(b)─┐
│ 3 │
└────────┘

示例 2

NULL 值被忽略。

select first_value(b) ignore nulls from test_data
┌─any(b) IGNORE NULLS ─┐
│ 3 │
└──────────────────────┘

示例 3

NULL 值被接受。

select first_value(b) respect nulls from test_data
┌─any(b) RESPECT NULLS ─┐
│ ᴺᵁᴸᴸ │
└───────────────────────┘

示例 4

使用带有 ORDER BY 的子查询来稳定结果。

SELECT
first_value_respect_nulls(b),
first_value(b)
FROM
(
SELECT *
FROM test_data
ORDER BY a ASC
)
┌─any_respect_nulls(b)─┬─any(b)─┐
│ ᴺᵁᴸᴸ │ 3 │
└──────────────────────┴────────┘