сталкивался.
Есть таблица, куда идут некторые метрики, по которым рисуются графики. Т.к. масштаб при отрисовке может быть разный, то есть несколько MV, агрегирующие min/max/sum/var/etc по секунде/минуте/часу, чтобы ускорять запросы и не группировать с raw данных.
Проблема в том, что при агрегации хочется пропускать не finite значения (для простоты только NaN) и оставлять в результирующей выборке их только в том случае, если все значения были nan.
Если использовать столбец minIf AggregateFunction(minIf, Float64, UInt8)
и при агрегации minIfState(value, isFinite(value)) AS min,
то работает почти как нужно: nan действительно не учитываются.
Однако, если все значения были nan, то результат получается 0:
SELECT minIfMerge(s) FROM (SELECT minIfState(42, isFinite(NaN)) s);
выдаёт 0
Как лучше всего обойти эту проблему и получить в результате nan?
у меня в таких случаях используются nullable() типы и не AggregateFunction, а SimpleAggregateFunction и соответственно функции типа anyLast возвращают null только в том случае, если других вариантов нет
Обсуждают сегодня