Módulo 5 · Consultas avanzadas

Calcula posiciones con funciones de ventana

Añade rankings y resúmenes sin perder el detalle de cada fila.

28 minNivel AvanzadoAntes necesitas: ORDER BY, agregaciones y CASE

0 de 45 lecciones

Al terminar, podrás

  • Explicar por qué una ventana conserva una fila por registro.
  • Reiniciar un cálculo mediante PARTITION BY.
  • Añadir criterios de desempate para obtener posiciones reproducibles.

Recupera lo aprendido: ¿Cuántas filas deja GROUP BY departamento: una por persona o una por departamento?

La idea clave

Una función de ventana calcula sobre filas relacionadas y conserva cada fila individual. OVER define el conjunto; PARTITION BY lo divide y el ORDER BY interior determina el orden del cálculo.

La diferencia que debes dominar
PreguntaGROUP BYfunción con OVER
¿Cuántas filas quedan?una por grupose conservan las filas de detalle
¿Dónde aparece el resumen?en la fila del grupojunto a cada fila relacionada
Úsalo cuando…quieres resumirquieres comparar detalle y resumen o calcular posiciones

Dos órdenes distintos: el ORDER BY dentro de OVER controla la numeración. Un ORDER BY al final controla cómo se muestran las filas.

La sintaxis básica

Estructura
ROW_NUMBER() OVER (
  PARTITION BY categoria
  ORDER BY precio DESC, id ASC
) AS posicion

Ejemplo paso a paso

Numeraremos los productos por precio dentro de cada categoría. El identificador actúa como desempate estable.

SQL
SELECT nombre, categoria, precio,
       ROW_NUMBER() OVER (
         PARTITION BY categoria
         ORDER BY precio DESC, id ASC
       ) AS posicion
FROM productos
ORDER BY categoria, posicion;
Resultado esperado
nombrecategoriaprecioposicion
TecladoAccesorios49,501
RatónAccesorios24,902
Cable USB-CAccesorios12,003
Disco SSDAlmacenamiento89,001
AuricularesAudio69,901
AltavozAudio54,002
Portátil ProOrdenadores999,001
Monitor 27Pantallas249,001
Monitor 24Pantallas179,002

Cómo funciona

  1. Cada categoría forma una partición independiente.
  2. La numeración empieza en 1 dentro de cada partición.
  3. La consulta conserva las nueve filas; no las resume como haría GROUP BY.
Comprueba tu comprensión

¿Qué sucede al comenzar una categoría nueva?

Agrega sin perder las filas

Las funciones de agregación también pueden trabajar como ventanas. La diferencia está en OVER: AVG(salario) sin ventana resume un conjunto, mientras que AVG(salario) OVER (PARTITION BY departamento) calcula la media de cada departamento y la repite en cada fila de esa partición.

Media por departamento
SELECT nombre, departamento, salario,
       ROUND(AVG(salario) OVER (
         PARTITION BY departamento
       ), 2) AS media_departamento
FROM empleados;

Cuando quieres la media de toda la partición, omite ORDER BY dentro de OVER. Añadirlo cambia el marco predeterminado y puede convertir el cálculo en un agregado acumulado según el motor y el marco usado.

Un error habitual

Filtrar el alias de ventana en el mismo WHERE

Consulta problemática
SELECT nombre,
       ROW_NUMBER() OVER (ORDER BY precio DESC) AS posicion
FROM productos
WHERE posicion <= 3;

Las ventanas se calculan después de WHERE, así que el alias aún no existe en esa fase. Calcula primero la posición en una subconsulta o CTE y filtra en la consulta exterior.

Practica con datos

Laboratorio SQL

Resuelve la consulta

Pendiente

Devuelve nombre, departamento, salario, media_departamento y posicion para Marketing y Ventas. Calcula AVG(salario) como ventana por departamento y redondea a dos decimales. Numera con ROW_NUMBER por salario descendente e id ascendente como desempate. Ordena el resultado por departamento y posicion.

Resultado esperado: 5 filas con nombre, departamento, salario, media_departamento y posicion, ordenadas por departamento y posicion.

Ver tablas y datos

Cargando la estructura del ejercicio…

La consulta usa datos ficticios y se ejecuta solo en este navegador.

Alcance del laboratorio: los agregados de ventana se validan sobre la partición completa, sin ORDER BY dentro de OVER. Para marcos y acumulados ordenados, utiliza un motor SQL completo.

Fuentes técnicas consultadas

Las fuentes explican el uso obligatorio de OVER, las particiones, el orden de cálculo y la conservación de filas.

Comprueba si puedes explicarlo

Si dos personas empatan en salario, ¿ROW_NUMBER les asigna el mismo número?

Ver respuesta razonada

No. Asigna números distintos. Un id único como desempate decide quién recibe cada posición. RANK y DENSE_RANK son otras funciones para posiciones compartidas.

Responde antes de abrir la explicación. Si necesitaste ayuda, cierra la respuesta y vuelve a explicarlo con tus palabras antes de dar la lección por aprendida.

Qué debes recordar

  • Las ventanas calculan sobre grupos sin convertirlos en una sola fila.
  • PARTITION BY reinicia el cálculo y ORDER BY dentro de OVER define su secuencia.
  • Añade un desempate único cuando la posición debe ser reproducible.

A continuación: Continúa con Añade filas con INSERT.

Conceptos relacionados