Последнее обновление
PERCENTILE_APPROX
Описание
Функция PERCENTILE_APPROX используется для вычисления приближённых процентилей, преимущественно для больших наборов данных. По сравнению с функцией PERCENTILE она обладает следующими особенностями:
- Экономное использование памяти: использует фиксированный объём памяти, сохраняя низкое потребление памяти даже при обработке столбцов с низкой кардинальностью (большой объём данных при небольшом числе различных элементов)
- Высокая производительность: подходит для обработки больших наборов данных с низкой кардинальностью и обеспечивает быстрое вычисление
- Настраиваемая точность: параметр сжатия позволяет регулировать баланс между точностью и производительностью
Синтаксис
PERCENTILE_APPROX(<col>, <p> [, <compression>])
Параметры
| Параметр | Описание |
|---|---|
<col> | Столбец, для которого вычисляются процентили. Поддерживаемый тип: Double. |
<p> | Значение процентиля, константа типа Double в диапазоне [0.0, 1.0]. Например, 0.99 соответствует 99-му процентилю. Должно быть константой. |
<compression> | Необязательный параметр: уровень сжатия типа Double в диапазоне [2048, 10000]. Более высокие значения повышают точность, но увеличивают потребление памяти. Если параметр не указан или его значение выходит за допустимый диапазон, используется значение по умолчанию 10000. |
Возвращаемое значение
Возвращает приближённый процентиль указанного столбца. Тип возвращаемого значения: Double. Если в группе нет допустимых данных, возвращает NULL.
Примеры
-- setup
CREATE TABLE response_times (
request_id INT,
response_time DECIMAL(10, 2)
) DUPLICATE KEY(`request_id`)
DISTRIBUTED BY HASH(`request_id`) BUCKETS AUTO
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
INSERT INTO response_times VALUES
(1, 10.5),
(2, 15.2),
(3, 20.1),
(4, 25.8),
(5, 30.3),
(6, 35.7),
(7, 40.2),
(8, 45.9),
(9, 50.4),
(10, 100.6);
-- Calculate 99th percentile using different compression levels
SELECT
percentile_approx(response_time, 0.99) as p99_default, -- Default compression
percentile_approx(response_time, 0.99, 2048) as p99_fast, -- Lower compression, faster
percentile_approx(response_time, 0.99, 10000) as p99_accurate -- Higher compression, more accurate
FROM response_times;
+-------------------+-------------------+-------------------+
| p99_default | p99_fast | p99_accurate |
+-------------------+-------------------+-------------------+
| 100.5999984741211 | 100.5999984741211 | 100.5999984741211 |
+-------------------+-------------------+-------------------+
SELECT percentile_approx(if(response_time>90,response_time,NULL), 0.5) FROM response_times;
В вычислении участвуют только данные, отличные от NULL.
+-----------------------------------------------------------------+
| percentile_approx(if(response_time>90,response_time,NULL), 0.5) |
+-----------------------------------------------------------------+
| 100.5999984741211 |
+-----------------------------------------------------------------+
SELECT percentile_approx(NULL, 0.99) FROM response_times;
Возвращает NULL, если все входные данные имеют значение NULL.
+-------------------------------+
| percentile_approx(NULL, 0.99) |
+-------------------------------+
| NULL |
+-------------------------------+