Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

quantileGK

quantileGK

Добавленный в: v23.4.0

Вычисляет quantile числовой последовательности с использованием алгоритма Greenwald-Khanna.

Алгоритм Greenwald-Khanna используется для очень эффективного вычисления квантилей в потоке данных. Он был представлен Майклом Гринвальдом и Сандживом Ханной в 2001 году. Он широко используется в базах данных и системах обработки больших данных, где требуется вычислять точные квантили на больших потоках данных в реальном времени. Алгоритм очень эффективен: для каждого элемента ему требуется всего O(log n) памяти и O(log log n) времени (где n — размер входных данных). При этом он обеспечивает высокую точность, выдавая приближённое значение квантиля с высокой вероятностью.

quantileGK отличается от других функций вычисления квантилей в ClickHouse тем, что позволяет пользователю управлять точностью приближённого результата.

Синтаксис

quantileGK(accuracy, level)(expr)

Псевдонимы: medianGK

Параметры

  • accuracy — Точность квантиля. Константное положительное целое число. Чем больше значение точности, тем меньше ошибка. Например, если аргумент accuracy задан как 100, вычисленный квантиль с высокой вероятностью будет иметь ошибку не более 1%. Между точностью вычисляемых квантилей и вычислительной сложностью алгоритма существует компромисс. Более высокое значение точности требует больше памяти и вычислительных ресурсов для точного вычисления квантиля, тогда как меньшее значение accuracy позволяет выполнять вычисления быстрее и с меньшими затратами памяти, но с несколько меньшей точностью. UInt*
  • level — Необязательный. Уровень квантиля. Константное число с плавающей точкой от 0 до 1. Значение по умолчанию: 0.5. При level=0.5 функция вычисляет медиану. Float*

Аргументы

Возвращаемое значение

Возвращает квантиль с указанными уровнем и точностью. Для числовых типов данных выходной формат совпадает с входным. (U)Int* или Int128 или UInt128 или Int256 или UInt256 или Float* или Decimal* или Date или DateTime или DateTime64

Примеры

Вычисление квантиля с разными значениями точности

SELECT quantileGK(1, 0.25)(number + 1) FROM numbers(1000);
┌─quantileGK(1, 0.25)(plus(number, 1))─┐
│                                    1 │
└──────────────────────────────────────┘

Квантиль с более высокой точностью

SELECT quantileGK(100, 0.25)(number + 1) FROM numbers(1000);
┌─quantileGK(100, 0.25)(plus(number, 1))─┐
│                                    251 │
└────────────────────────────────────────┘

См. также

Navigation