Последнее обновление
WIDTH_BUCKET
Описание
Строит гистограмму с интервалами одинаковой ширины: диапазон гистограммы делится на равные интервалы, а после вычисления возвращается номер интервала, в который попадает значение выражения. Особые случаи:
- Функция возвращает целое число или NULL (если хотя бы один входной параметр равен NULL, возвращается NULL)
Синтаксис
WIDTH_BUCKET(<expr>, <min_value>, <max_value>, <num_buckets>)
Параметры
| Параметр | Описание |
|---|---|
<expr> | Выражение для построения гистограммы. Результатом этого выражения должно быть числовое значение или значение, которое можно неявно преобразовать в числовое. Значение должно находиться в диапазоне от -(2^53 - 1) до 2^53 - 1 (включительно) |
<min_value> | Нижняя граница допустимого диапазона значений выражения. Параметр должен быть числовым и не равняться <max_value>. Значение должно находиться в диапазоне от -(2^53 - 1) до 2^53 - 1 (включительно). Кроме того, разность между верхней и нижней границами должна быть меньше 2^53 (например: abs(max_value - min_value) < 2^53) |
<max_value> | Верхняя граница допустимого диапазона значений выражения. Параметр должен быть числовым и не равняться <min_value>. Значение должно находиться в диапазоне от -(2^53 - 1) до 2^53 - 1 (включительно). Кроме того, разность между верхней и нижней границами должна быть меньше 2^53 (например: abs(max_value - min_value) < 2^53) |
<num_buckets> | Количество интервалов. Должно быть положительным целым числом. Функция распределяет значения выражения по интервалам и возвращает номер соответствующего интервала |
Возвращаемое значение
Возвращает номер интервала, в который попадает значение выражения. Если значение выражения выходит за пределы диапазона, применяются следующие правила:
- Если значение выражения меньше
min_value, возвращается 0. - Если значение выражения больше или равно max_value, возвращается
num_buckets + 1. - Если хотя бы один параметр равен
null, возвращаетсяnull
Пример
DROP TABLE IF EXISTS width_bucket_test;
CREATE TABLE IF NOT EXISTS width_bucket_test (
`k1` int NULL COMMENT "",
`v1` date NULL COMMENT "",
`v2` double NULL COMMENT "",
`v3` bigint NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`k1`)
DISTRIBUTED BY HASH(`k1`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"storage_format" = "V2"
);
INSERT INTO width_bucket_test VALUES
(1, "2022-11-18", 290000.00, 290000),
(2, "2023-11-18", 320000.00, 320000),
(3, "2024-11-18", 399999.99, 399999),
(4, "2025-11-18", 400000.00, 400000),
(5, "2026-11-18", 470000.00, 470000),
(6, "2027-11-18", 510000.00, 510000),
(7, "2028-11-18", 610000.00, 610000),
(8, null, null, null);
SELECT * FROM width_bucket_test ORDER BY k1;
+------+------------+-----------+--------+
| k1 | v1 | v2 | v3 |
+------+------------+-----------+--------+
| 1 | 2022-11-18 | 290000 | 290000 |
| 2 | 2023-11-18 | 320000 | 320000 |
| 3 | 2024-11-18 | 399999.99 | 399999 |
| 4 | 2025-11-18 | 400000 | 400000 |
| 5 | 2026-11-18 | 470000 | 470000 |
| 6 | 2027-11-18 | 510000 | 510000 |
| 7 | 2028-11-18 | 610000 | 610000 |
| 8 | NULL | NULL | NULL |
+------+------------+-----------+--------+
SELECT k1, v1, v2, v3, width_bucket(v1, date('2023-11-18'), date('2027-11-18'), 4) AS w FROM width_bucket_test ORDER BY k1;
+------+------------+-----------+--------+------+
| k1 | v1 | v2 | v3 | w |
+------+------------+-----------+--------+------+
| 1 | 2022-11-18 | 290000 | 290000 | 0 |
| 2 | 2023-11-18 | 320000 | 320000 | 1 |
| 3 | 2024-11-18 | 399999.99 | 399999 | 2 |
| 4 | 2025-11-18 | 400000 | 400000 | 3 |
| 5 | 2026-11-18 | 470000 | 470000 | 4 |
| 6 | 2027-11-18 | 510000 | 510000 | 5 |
| 7 | 2028-11-18 | 610000 | 610000 | 5 |
| 8 | NULL | NULL | NULL | NULL |
+------+------------+-----------+--------+------+
SELECT k1, v1, v2, v3, width_bucket(v2, 200000, 600000, 4) AS w FROM width_bucket_test ORDER BY k1;
+------+------------+-----------+--------+------+
| k1 | v1 | v2 | v3 | w |
+------+------------+-----------+--------+------+
| 1 | 2022-11-18 | 290000 | 290000 | 1 |
| 2 | 2023-11-18 | 320000 | 320000 | 2 |
| 3 | 2024-11-18 | 399999.99 | 399999 | 2 |
| 4 | 2025-11-18 | 400000 | 400000 | 3 |
| 5 | 2026-11-18 | 470000 | 470000 | 3 |
| 6 | 2027-11-18 | 510000 | 510000 | 4 |
| 7 | 2028-11-18 | 610000 | 610000 | 5 |
| 8 | NULL | NULL | NULL | NULL |
+------+------------+-----------+--------+------+
SELECT k1, v1, v2, v3, width_bucket(v3, 200000, 600000, 4) AS w FROM width_bucket_test ORDER BY k1;
+------+------------+-----------+--------+------+
| k1 | v1 | v2 | v3 | w |
+------+------------+-----------+--------+------+
| 1 | 2022-11-18 | 290000 | 290000 | 1 |
| 2 | 2023-11-18 | 320000 | 320000 | 2 |
| 3 | 2024-11-18 | 399999.99 | 399999 | 2 |
| 4 | 2025-11-18 | 400000 | 400000 | 3 |
| 5 | 2026-11-18 | 470000 | 470000 | 3 |
| 6 | 2027-11-18 | 510000 | 510000 | 4 |
| 7 | 2028-11-18 | 610000 | 610000 | 5 |
| 8 | NULL | NULL | NULL | NULL |
+------+------------+-----------+--------+------+