Перейти к основному содержанию
Перейти к основному содержанию

first_value

Это псевдоним для any, но он был добавлен для совместимости с оконными функциями, где иногда требуется обрабатывать значения NULL (по умолчанию все агрегатные функции ClickHouse игнорируют значения NULL).

Поддерживается указание модификатора для учёта значений NULL (RESPECT NULLS) как в оконных функциях, так и в обычных агрегациях.

Как и в случае с any, без использования оконных функций результат будет случайным, если входной поток не упорядочен, а тип возвращаемого значения совпадает с типом входного (значение NULL возвращается только в том случае, если входной тип является Nullable или добавлен комбинатор -OrNull).

Примеры

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