SQL · funciones de ventana

NTILE en SQL: dividir filas ordenadas en grupos

Usa NTILE(N) para repartir las filas de una partición ordenada en N grupos lo más equilibrados posible y asignar a cada fila el número de su grupo.

Lectura: 7–9 minSQL comprobadoPráctica con pistas
Contenido de esta guía

Respuesta rápida

NTILE(N) numera cada fila con un grupo entre 1 y N después de ordenar la ventana. Si el número de filas no se divide exactamente entre N, algunos grupos tienen una fila más; los grupos grandes se asignan primero según el orden.

Sintaxis mínima
NTILE(4) OVER (
  ORDER BY puntuacion DESC, id
)

El ORDER BY define quién entra antes en los grupos. PARTITION BY es opcional y reinicia la división dentro de cada partición.

Modelo mental: reparte filas, no calcula percentiles exactos

Piensa en una fila ordenada de personas y en N cajas. NTILE recorre ese orden y distribuye las filas para que las cajas tengan tamaños tan parecidos como sea posible. El resultado es una etiqueta de grupo, no un porcentaje matemático del valor.

«Cuartil» es una etiqueta práctica, no una frontera estadística exacta. Si existen muchos valores empatados, NTILE(4) puede separar filas con el mismo valor en grupos distintos porque su objetivo principal es equilibrar la cantidad de filas.

Ejemplo: terciles de precio

La base educativa tiene nueve productos. Al usar NTILE(3), cada grupo recibe exactamente tres filas. Añadimos id como desempate para que el orden sea reproducible.

Productos en tres grupos
SELECT
  id,
  nombre,
  precio,
  NTILE(3) OVER (
    ORDER BY precio DESC, id
  ) AS tercio_precio
FROM productos
ORDER BY precio DESC, id;
Resultado comprobado en SQLite
idnombrepreciotercio_precio
4Portátil Pro999,001
7Monitor 27249,001
3Monitor 24179,001
8Disco SSD89,002
5Auriculares69,902
10Altavoz54,002
2Teclado49,503
1Ratón24,903
9Cable USB-C12,003

Reinicia los grupos con PARTITION BY

Si quieres clasificar dentro de cada categoría, departamento o cliente, añade PARTITION BY. Cada partición recibe sus propios grupos 1…N.

NTILE por categoría
SELECT
  categoria,
  nombre,
  precio,
  NTILE(2) OVER (
    PARTITION BY categoria
    ORDER BY precio DESC, id
  ) AS mitad_en_categoria
FROM productos
ORDER BY categoria, mitad_en_categoria, precio DESC;

Una categoría con una sola fila seguirá recibiendo el grupo 1. Si hay menos filas que grupos solicitados, algunos números de grupo no aparecen porque no existen filas que asignarles.

NTILE, RANK y ROW_NUMBER responden preguntas distintas

FunciónPreguntaEfecto de empates
ROW_NUMBER()¿Qué posición secuencial ocupa cada fila?Cada fila recibe un número distinto.
RANK()¿Qué puesto ocupa este valor respecto a los demás?Los pares comparten puesto y aparecen huecos.
NTILE(N)¿En cuál de N grupos equilibrados cae esta fila?Puede separar empates para equilibrar tamaños.

Errores frecuentes

Interpretar el grupo 1 como «el 25 % superior» sin revisar los datos

Con NTILE(4) el primer grupo contiene aproximadamente una cuarta parte de las filas, pero no necesariamente todos los valores por encima de un umbral estadístico. Los empates y el tamaño total importan.

Omitir un desempate cuando el resultado debe ser reproducible

Si el ORDER BY deja empates sin resolver, el motor puede asignar el orden relativo de esas filas de manera no garantizada. Añade una clave estable cuando el reparto concreto importe.

Compatibilidad entre motores

PostgreSQL, SQLite, MySQL 8.4 y SQL Server documentan NTILE como función de ventana. Todos requieren un OVER; SQL Server documenta explícitamente el ORDER BY dentro de esa ventana. Los tipos devueltos y detalles del optimizador pueden variar, pero la idea de repartir cada partición en grupos casi iguales es compartida.

Práctica: divide los productos en cuatro grupos

Intermedia · ventanas

Crea cuatro grupos de precio

Devuelve id, nombre, precio y un cuartil calculado con NTILE(4). Ordena de mayor a menor precio y usa id para desempatar.

Qué debes recordar

  • NTILE(N) asigna a cada fila un grupo entre 1 y N.
  • El reparto busca tamaños lo más equilibrados posible.
  • El ORDER BY define quién entra primero; añade desempate si importa la reproducibilidad.
  • No confundas grupos de filas con percentiles exactos del valor.

Conceptos relacionados

Fuentes técnicas consultadas

Las referencias oficiales se usaron para verificar el reparto de grupos, el papel del orden y la compatibilidad.