Al terminar esta lección podrás
- Utilizar ROW_NUMBER.
- Distinguir ventana y agregación.
- Interpretar PARTITION BY y ORDER BY.
Antes de empezar: ORDER BY, agregaciones y CASE. Explica en una frase qué recuerdas antes de continuar.
La idea, sin código
Una función de ventana calcula sobre filas relacionadas y conserva cada fila individual. OVER define la ventana; PARTITION BY crea grupos y ORDER BY establece el orden dentro de ellos.
Pregunta guía: ¿qué representa cada fila antes y después de aplicar este concepto?
Sintaxis mínima
ROW_NUMBER() OVER (
PARTITION BY columna
ORDER BY columna DESC
)Primer ejemplo guiado
| id | nombre | departamento | salario | fecha_alta |
|---|---|---|---|---|
| 1 | Lucía | Ventas | 28000 | 2024-02-12 |
| 2 | Diego | Datos | 36000 | 2023-09-01 |
| 3 | Sara | Datos | 39000 | 2022-04-18 |
| 4 | Iván | Ventas | 31000 | 2025-01-10 |
| 5 | Elena | Soporte | 29500 | 2024-11-20 |
Analiza la consulta antes de comprobar el resultado:
SELECT nombre, departamento, salario,
ROW_NUMBER() OVER (
PARTITION BY departamento
ORDER BY salario DESC
) AS posicion
FROM empleados
ORDER BY departamento, posicion;| nombre | departamento | salario | posicion |
|---|---|---|---|
| Sara | Datos | 39000 | 1 |
| Diego | Datos | 36000 | 2 |
| Elena | Soporte | 29500 | 1 |
| Iván | Ventas | 31000 | 1 |
| Lucía | Ventas | 28000 | 2 |
Qué ocurre paso a paso
- PARTITION BY reinicia la numeración por departamento.
- ORDER BY salario DESC coloca primero el salario mayor.
- Cada empleado conserva su propia fila.
Error frecuente
Consulta o razonamiento problemático
ROW_NUMBER(PARTITION BY departamento)Las funciones de ventana necesitan OVER y los elementos de la ventana se escriben dentro de sus paréntesis.
Práctica guiada
Resuelve una sola dificultad cada vez
Numera los productos de mayor a menor precio dentro de cada categoría.
Solución razonada
SELECT nombre, categoria, precio, ROW_NUMBER() OVER (PARTITION BY categoria ORDER BY precio DESC) AS posicion FROM productos;La numeración se reinicia para cada categoría y mantiene una fila por producto.
Comprueba: identifica qué parte recupera, filtra, transforma, relaciona o modifica los datos.
Ahora sin guía
Transfiere lo aprendido
Compara verbalmente el resultado de GROUP BY departamento con ROW_NUMBER particionado por departamento.
Comparar con una solución posible
GROUP BY produce una fila por departamento; ROW_NUMBER conserva una fila por empleado y añade su posición.Puede existir otra solución válida. Comprueba que produce el resultado pedido y que puedes explicar cada cláusula.
Resumen para llevarte
- Las ventanas conservan el detalle.
- PARTITION BY define grupos sin colapsarlos.
- ORDER BY dentro de OVER define el cálculo, no necesariamente el orden final.
Siguiente paso: Continúa con Añadir filas con INSERT.