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.
| Pregunta | GROUP BY | función con OVER |
|---|---|---|
| ¿Cuántas filas quedan? | una por grupo | se conservan las filas de detalle |
| ¿Dónde aparece el resumen? | en la fila del grupo | junto a cada fila relacionada |
| Úsalo cuando… | quieres resumir | quieres 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
ROW_NUMBER() OVER (
PARTITION BY categoria
ORDER BY precio DESC, id ASC
) AS posicionEjemplo paso a paso
Numeraremos los productos por precio dentro de cada categoría. El identificador actúa como desempate estable.
SELECT nombre, categoria, precio,
ROW_NUMBER() OVER (
PARTITION BY categoria
ORDER BY precio DESC, id ASC
) AS posicion
FROM productos
ORDER BY categoria, posicion;| nombre | categoria | precio | posicion |
|---|---|---|---|
| Teclado | Accesorios | 49,50 | 1 |
| Ratón | Accesorios | 24,90 | 2 |
| Cable USB-C | Accesorios | 12,00 | 3 |
| Disco SSD | Almacenamiento | 89,00 | 1 |
| Auriculares | Audio | 69,90 | 1 |
| Altavoz | Audio | 54,00 | 2 |
| Portátil Pro | Ordenadores | 999,00 | 1 |
| Monitor 27 | Pantallas | 249,00 | 1 |
| Monitor 24 | Pantallas | 179,00 | 2 |
Cómo funciona
- Cada categoría forma una partición independiente.
- La numeración empieza en 1 dentro de cada partición.
- La consulta conserva las nueve filas; no las resume como haría
GROUP BY.
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.
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
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
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…
Calcula primero AVG(salario) OVER (PARTITION BY departamento).
Añade ROW_NUMBER() con PARTITION BY departamento.
Ordena la ventana por salario DESC, id ASC y el resultado final por departamento, posicion.
Solución
SELECT nombre, departamento, salario,
ROUND(AVG(salario) OVER (PARTITION BY departamento), 2) AS media_departamento,
ROW_NUMBER() OVER (PARTITION BY departamento ORDER BY salario DESC, id ASC) AS posicion
FROM empleados
WHERE departamento IN ('Marketing', 'Ventas')
ORDER BY departamento, posicion;AVG repite la media de cada departamento sin agrupar las filas; ROW_NUMBER añade una posición y el ORDER BY exterior fija la presentación.
Puedes consultar la solución y volver a intentarlo. La práctica se completa cuando tu consulta funciona.
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.
- PostgreSQL: introducción a funciones de ventana
- PostgreSQL: funciones de ventana disponibles
- SQLite: funciones de ventana
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.