first_value
它是 any
的别名,但它是为了与 窗口函数 保持兼容性而引入的,在某些情况下,需要处理 NULL
值(默认情况下,所有 ClickHouse 聚合函数都忽略 NULL
值)。
它支持声明一个修饰符以尊重空值 (RESPECT NULLS
),无论是在 窗口函数 中还是在普通聚合中。
与 any
一样,如果没有窗口函数,如果源流不是有序的,结果将是随机的,并且返回类型与输入类型匹配(仅当输入是可空或添加了 -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 │
└──────────────────────┴────────┘