De ventanaestándar SQL

NTILE

Divide las filas en el número de grupos indicado, de tamaño parecido, y numera los grupos.

Sintaxis

NTILE(<número de grupos>) OVER (ORDER BY <criterio de orden>)
NTILE(<número de grupos>) OVER (PARTITION BY <grupo> ORDER BY <criterio de orden>)

Reparte las filas ordenadas en N grupos e indica en cuál está cada fila: 1, 2, …, N. Si las filas no se reparten a partes iguales, las sobrantes van a los primeros grupos. Así se divide en mitades, tercios o cuartos: «la mitad más cara de los pedidos», «el 25 % superior por salario».

Datos para los ejemplos

employees

namedepartmentsalarybonusphone
Emmabackend1200300+44 7700 900123
Liambackend1000NULLNULL
Oliviafrontend1350150+44 7700 900456
Noahfrontend950NULL+44 7700 900789
Sophiadesign1200200NULL

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.

Dos mitades por salario
SELECT name, salary,
NTILE(2) OVER (ORDER BY salary DESC) AS half
FROM employees;
namesalaryhalf
Olivia13501
Emma12001
Sophia12001
Liam10002
Noah9502

5 filas no se reparten a partes iguales en dos grupos, así que el primero es más grande: 3 y 2.

Tres grupos de pedidos por importe
SELECT id, amount,
NTILE(3) OVER (ORDER BY amount DESC) AS bucket
FROM orders;
idamountbucket
3199.991
1120.501
280.252
564.752
445.003
Solo la mitad más cara de los pedidosAvanzado
SELECT id, amount
FROM (
SELECT id, amount,
NTILE(2) OVER (ORDER BY amount DESC) AS half
FROM orders
) split
WHERE half = 1;
idamount
3199.99
1120.50
280.25

Ten en cuenta

Los grupos son iguales en número de filas, no en valores. Importes iguales pueden caer en grupos distintos, y los límites de los grupos pueden quedar en cualquier sitio.

Si hay más grupos que filas, algunos grupos quedan vacíos: NTILE(10) para 5 filas da los números del 1 al 5.

El resultado no se puede usar en el WHERE de la misma consulta: calcúlalo primero en una subconsulta y filtra fuera.

Funciones relacionadas

Más detalles en el curso