Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

quantilesGK

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