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

first_value

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

它支持声明一个修饰符以尊重 NULL 值(RESPECT NULLS),在 Window Functions 和普通聚合中均适用。

any 一样,在没有 Window Functions 的情况下,如果源流未排序并且返回类型与输入类型匹配,结果将是随机的(仅在输入为 Nullable 或添加了 -OrNull 组合时返回 Null)。

examples

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);

Example 1

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

SELECT first_value(b) FROM test_data;
┌─any(b)─┐
│      3 │
└────────┘

Example 2

NULL 值被忽略。

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

Example 3

接受 NULL 值。

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

Example 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 │
└──────────────────────┴────────┘