Числастандарт SQL

WIDTH_BUCKET

Каже, в який із рівних діапазонів потрапляє число: 1, 2, 3…

Синтаксис

WIDTH_BUCKET(<значення>, <від>, <до>, <кількість кошиків>)
WIDTH_BUCKET(<значення>, ARRAY[<межа1>, <межа2>, …])

Ділить проміжок від <від> до <до> на задану кількість рівних кошиків і повертає номер кошика для значення. Те, що менше за початок, отримує 0, а що не менше за кінець — кількість + 1. Зручно для гістограм: скільки замовлень до 50, від 50 до 100 і так далі.

Дані для прикладів

orders

idcreated_atamount
12026-07-03 10:15:00120.50
22026-07-28 18:40:0080.25
32026-08-09 09:05:00199.99
42026-08-21 14:30:0045.00
52026-09-02 11:00:0064.75

Ці таблиці вже створено в пісочниці — приклади нижче працюють із ними. Хочеш повторити у своїй базі — скопіюй SQL.

Номер кошика
SELECT WIDTH_BUCKET(35, 0, 100, 4) AS bucket;
bucket
2

Проміжок 0–100 ділиться на чотири кошики по 25, і 35 потрапляє в другий.

Гістограма сум замовлень
SELECT WIDTH_BUCKET(amount, 0, 200, 4) AS bucket,
COUNT(*) AS order_count
FROM orders
GROUP BY bucket
ORDER BY bucket;
bucketorder_count
11
22
31
41

Кошики по 50: 1 — до 50, 2 — від 50 до 100 і так далі.

Нерівні межі масивом
SELECT id, amount,
WIDTH_BUCKET(amount, ARRAY[50, 100, 150]) AS bucket
FROM orders;
idamountbucket
1120.502
280.251
3199.993
445.000
564.751

Із масивом межі можуть бути будь-якими: до 50 — кошик 0, від 50 до 100 — 1, від 100 до 150 — 2, далі — 3.

Зверни увагу

Значення поза проміжком не губляться, а отримують 0 чи кількість + 1: WIDTH_BUCKET(250, 0, 200, 4) дає 5.

Кінець проміжку не входить в останній кошик: WIDTH_BUCKET(200, 0, 200, 4) теж дає 5, а не 4.

Номер кошика — не межа. Щоб підписати гістограму, межу рахують назад: (bucket - 1) * 50.

Схожі функції