0Pricing
SQL Academy · Lección

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

  1. OVER, PARTITION BY y ORDER BY
  2. ROW_NUMBER, RANK y DENSE_RANK
  3. LAG, LEAD y patrones de series temporales
  4. Totales acumulados y medias móviles
← Volver a SQL Academy