Númerosestándar SQL

WIDTH_BUCKET

Indica en cuál de varios rangos iguales cae un número: 1, 2, 3…

Sintaxis

WIDTH_BUCKET(<valor>, <desde>, <hasta>, <número de cubetas>)
WIDTH_BUCKET(<valor>, ARRAY[<límite1>, <límite2>, …])

Divide el intervalo de <desde> a <hasta> en el número indicado de cubetas iguales y devuelve el número de cubeta del valor. Lo que queda por debajo del inicio recibe 0, y lo que no queda por debajo del final, el número de cubetas + 1. Útil para histogramas: cuántos pedidos hay por debajo de 50, de 50 a 100, etcétera.

Datos para los ejemplos

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

Estas tablas ya están creadas en el entorno de pruebas y los ejemplos de abajo las usan. ¿Quieres repetirlo en tu propia base de datos? Copia el SQL.

El número de cubeta
SELECT WIDTH_BUCKET(35, 0, 100, 4) AS bucket;
bucket
2

El intervalo 0–100 se divide en cuatro cubetas de 25, y 35 cae en la segunda.

Un histograma de importes de pedidos
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

Cubetas de 50: 1 — por debajo de 50, 2 — de 50 a 100, etcétera.

Límites irregulares con un array
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

Con un array, los límites pueden ser cualesquiera: por debajo de 50 — cubeta 0, de 50 a 100 — 1, de 100 a 150 — 2, por encima — 3.

Ten en cuenta

Los valores fuera del intervalo no se pierden: reciben 0 o el número de cubetas + 1: WIDTH_BUCKET(250, 0, 200, 4) da 5.

El final del intervalo no entra en la última cubeta: WIDTH_BUCKET(200, 0, 200, 4) también da 5, no 4.

El número de cubeta no es un límite. Para rotular un histograma, el límite se calcula al revés: (bucket - 1) * 50.

Funciones relacionadas