В SQL агрегированные функции sum (x), avg (x), max (x), min (x) возвращают NULL, когда x пуст или содержит только значения NULL.Получение агрегатных функций для возврата null в KDB
В KDB сумма и avg возвращают ноль, а максимальный и минимальный возврат (+ или -) бесконечности.
Чтобы получить желаемое поведение возвращения нуль я пришел с 2-х вариантов:
(A) Удалите аннулирует, и проверить, если результат пуст, прежде чем агрегирование как обычно
nsum:{[x] x: x where not null x; $[0=count x; 0N; sum x]}
(B) Создайте новый агрегат, который проверяет каждый элемент за нуль до накопления.
Обратите внимание, что нам по-прежнему нужно проверить пустой список.
nsum:{[z] $[0=count z; 0N; {[x;y] $[null x; y; null y; x; x+y]}/ z ]}
Есть ли лучший (более быстрый и/или более удобный) способ, чем A или B?
Будет ли метод (B) работать лучше, чем метод (A)?
Метод (A) имеет то преимущество, что он работает для любой агрегатной функции. Метод (B) не работает для «среднего», потому что нет парной функции , которая будет генерировать текущее среднее (необходимо знать, сколько элементов уже было применено).
Связанный вопрос: есть ли более быстрый способ проверить пустой список, чем 0=count x
, например 0= type first x
?
СПАСИБО!