quantilesGK
Добавленный в: v23.4.0
Вычисляет несколько квантилей числовой последовательности на разных уровнях одновременно с использованием алгоритма Greenwald-Khanna.
Эта функция похожа на quantileGK, но позволяет вычислять несколько уровней квантилей за один проход, что эффективнее, чем вызывать отдельные функции квантилей.
Алгоритм Greenwald-Khanna используется для очень эффективного вычисления квантилей в потоке данных. Он был предложен Майклом Гринвальдом и Сандживом Ханной в 2001 году. Алгоритм очень эффективен: для каждого элемента требуется лишь O(log n) памяти и O(log log n) времени (где n — размер входных данных). Он также отличается высокой точностью, обеспечивая приблизительные значения квантилей с управляемой точностью.
Синтаксис
quantilesGK(accuracy, level1, level2, ...)(expr)Параметры
accuracy— Точность квантилей. Константное положительное целое число. Чем больше значение точности, тем меньше ошибка. Например, если аргументaccuracyзадан равным 100, вычисленные квантили будут иметь ошибку не более 1% с высокой вероятностью. Между точностью вычисляемых квантилей и вычислительной сложностью алгоритма приходится искать компромисс.UInt*level— Уровни квантилей. Одно или несколько константных чисел с плавающей запятой в диапазоне от 0 до 1.Float*
Аргументы
expr— Выражение над значениями столбца, результатом вычисления которого являются числовые типы данных,Date,DateTimeилиDateTime64.(U)Int*илиInt128илиUInt128илиInt256илиUInt256илиFloat*илиDecimal*илиDateилиDateTimeилиDateTime64
Возвращаемое значение
Массив квантилей указанных уровней в том же порядке, в котором эти уровни были заданы. Для числовых типов данных формат вывода соответствует входному формату. Array((U)Int*) или Array(Int128) или Array(UInt128) или Array(Int256) или Array(UInt256) или Array(Float*) или Array(Decimal*) или Array(Date) или Array(DateTime) или Array(DateTime64)
Примеры
Вычисление нескольких квантилей с помощью алгоритма GK
SELECT quantilesGK(1, 0.25, 0.5, 0.75)(number + 1) FROM numbers(1000);┌─quantilesGK(1, 0.25, 0.5, 0.75)(plus(number, 1))─┐
│ [1,1,1] │
└──────────────────────────────────────────────────┘Более точные квантили
SELECT quantilesGK(100, 0.25, 0.5, 0.75)(number + 1) FROM numbers(1000);┌─quantilesGK(100, 0.25, 0.5, 0.75)(plus(number, 1))─┐
│ [251,498,741] │
└────────────────────────────────────────────────────┘