агрегатных функций:
1) Если использовать агрегатную функцию напрямую, то она успешно сохраняет NULL и возвращает его как результат.
SELECT any(CAST(NULL AS Nullable(UInt8)))
┌─any(CAST(NULL, \'Nullable(UInt8)\'))─┐
│ \N │
└──────────────────────────────────────┘
2) Если разделить этот этап на две части (ну т.е. например сделать таблицу с колонками-состояниями и вьюху, которая будет доагрегировать их... по некоторой аналогии как cloudflare описывало в своей статье) то NULL пропадает начисто и превращается в 0 для чисел.
SELECT anyMerge(a) FROM ( SELECT anyState(CAST(NULL AS Nullable(UInt8))) AS a)
┌─anyMerge(a)─┐
│ 0 │
└─────────────┘
Судя по исходникам (https://github.com/yandex/ClickHouse/blob/486a498b9f6300ee432074cffdd889e485b5c1c1/dbms/src/AggregateFunctions/AggregateFunctionNull.cpp) такое поведение корректно. И почему "Aggregate function combinator 'Null' is only for internal usage" так сделано? вроде как этот комбинатор решил бы проблему если бы был доступен.
Есть варианты?
Агрегатные функции от Nullable аргументов работают так: - пропускают все NULL; - если других значений не было вообще, то возвращает NULL;
Тут пример
Обсуждают сегодня