ROW_NUMBER, RANK y DENSE_RANK
Numere y clasifique filas dentro de particiones y elija la función de clasificación adecuada para gestionar empates.
ROW_NUMBER, RANK y DENSE_RANK es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
Tres funciones de numeración
Tres funciones de ventana que numeran las filas dentro de una partición:
ROW_NUMBER()— 1, 2, 3, 4 (siempre únicos)RANK()— 1, 2, 2, 4 (los empates comparten posición y después se salta)DENSE_RANK()— 1, 2, 2, 3 (los empates comparten posición, sin saltos)
ROW_NUMBER
Asigna 1, 2, 3 dentro de cada partición. Los empates se resuelven arbitrariamente; proporcione un criterio adicional en ORDER BY para obtener resultados deterministas:
SELECT id, user_id, total,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY total DESC, id
) AS rn
FROM orders;Los N primeros por grupo
El uso clásico de ROW_NUMBER:
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY total DESC
) AS rn
FROM orders
)
SELECT * FROM ranked WHERE rn <= 3;
-- Each user's top 3 orders.RANK
Las filas con el mismo valor de ORDER BY reciben la misma posición; el siguiente valor distinto salta el hueco:
-- totals: 100, 90, 90, 70
-- RANK: 1, 2, 2, 4 (skipped 3)
SELECT id, total,
RANK() OVER (ORDER BY total DESC) AS rk
FROM orders;DENSE_RANK
Igual que RANK, pero sin huecos:
-- totals: 100, 90, 90, 70
-- DENSE: 1, 2, 2, 3
SELECT id, total,
DENSE_RANK() OVER (ORDER BY total DESC) AS dr
FROM orders;Elegir entre ellas
- ¿Necesita números únicos (por ejemplo, para paginación)?
ROW_NUMBER - ¿Necesita ordenar con el criterio tradicional de «los empates saltan posiciones»?
RANK - ¿Necesita ordenar con el criterio de «los empates comparten posición y la siguiente es consecutiva»?
DENSE_RANK
NTILE: grupos de cuantiles
NTILE(n) distribuye las filas en n grupos aproximadamente iguales:
SELECT id, total,
NTILE(4) OVER (ORDER BY total) AS quartile
FROM orders;
-- 1 = bottom 25%, 4 = top 25%Eliminar filas duplicadas
Use ROW_NUMBER + DELETE para conservar una fila por cada grupo de duplicados:
WITH dups AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
FROM users
)
DELETE FROM users WHERE id IN (SELECT id FROM dups WHERE rn > 1);Paginación por grupo
Página 2 de «los pedidos de cada usuario, 5 por página»:
WITH r AS (
SELECT id, user_id,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
FROM orders
)
SELECT * FROM r WHERE rn BETWEEN 6 AND 10;PERCENT_RANK y CUME_DIST
Posición relativa dentro de la partición:
SELECT id, total,
PERCENT_RANK() OVER (ORDER BY total) AS pct_rank,
CUME_DIST() OVER (ORDER BY total) AS cume_dist
FROM orders;Rendimiento
Las funciones de numeración necesitan datos ordenados dentro de cada partición. Un índice sobre (partition_col, order_col) puede evitar el paso de ordenación.
Resumen
Tres funciones de numeración cubren la mayoría de las necesidades.
- ROW_NUMBER para obtener valores únicos
- RANK / DENSE_RANK para ordenar con empates
- NTILE para grupos de cuantiles
Comprobación rápida
Dados los totales 100, 90, 90, 70, ¿qué resultado produce DENSE_RANK?
Preguntas frecuentes
¿La lección «ROW_NUMBER, RANK y DENSE_RANK» es gratis?
Sí — el texto completo de «ROW_NUMBER, RANK y DENSE_RANK» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «ROW_NUMBER, RANK y DENSE_RANK»?
Numere y clasifique filas dentro de particiones y elija la función de clasificación adecuada para gestionar empates. Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Academy?
No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «ROW_NUMBER, RANK y DENSE_RANK»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Academy?
Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- OVER, PARTITION BY y ORDER BY
- ROW_NUMBER, RANK y DENSE_RANK
- LAG, LEAD y patrones de series temporales
- Totales acumulados y medias móviles