Repaso de CASE y funciones de ventana
Crea una categoría para cada fila y calcula su posición dentro de un grupo sin reducir el resultado a una fila por grupo.
Al terminar, podrás
- Distinguir un cálculo condicional de un cálculo sobre filas relacionadas.
- Combinar
CASEyROW_NUMBERen el mismo resultado. - Reconocer por qué el orden dentro de
OVERdebe ser determinista.
Dos herramientas que responden preguntas distintas
CASE evalúa condiciones y devuelve un valor. Una función de ventana utiliza un conjunto de filas relacionado con la fila actual. Ambas conservan el detalle: no agrupan varias filas en una sola como lo haría una agregación normal con GROUP BY.
Modelo mental: CASE pregunta «¿qué etiqueta corresponde a esta fila?». ROW_NUMBER() OVER (...) pregunta «¿qué posición ocupa esta fila dentro de su partición y orden?».
Elige la herramienta por la forma del resultado
| Necesidad | Herramienta | Filas finales |
|---|---|---|
| Asignar una etiqueta según la fila | CASE | Una por fila de entrada |
| Resumir un departamento | GROUP BY y agregados | Una por grupo |
| Comparar o numerar dentro del departamento | Función de ventana | Se conserva cada empleado |
Esta comparación evita un error habitual: utilizar una ventana cuando realmente se busca un resumen, o agrupar cuando todavía se necesita ver el detalle de cada empleado.
Ejemplo verificado
Clasificamos el salario y calculamos una posición dentro de cada departamento. El segundo criterio de orden, id, resuelve empates de forma estable.
SELECT nombre,
departamento,
salario,
CASE
WHEN salario >= 35000 THEN 'tramo alto'
ELSE 'tramo inicial'
END AS tramo,
ROW_NUMBER() OVER (
PARTITION BY departamento
ORDER BY salario DESC, id
) AS posicion
FROM empleados
ORDER BY departamento, posicion;| nombre | departamento | salario | tramo | posicion |
|---|---|---|---|---|
| Gonzalo Nieto | Marketing | 31500 | tramo inicial | 1 |
| Helena Costa | Marketing | 30000 | tramo inicial | 2 |
| Carlos Peña | Tecnología | 46000 | tramo alto | 1 |
| Diana León | Tecnología | 39000 | tramo alto | 2 |
| Ismael Díaz | Ventas | 36000 | tramo alto | 1 |
| Alex Ramos | Ventas | 33000 | tramo inicial | 2 |
| Bea Molina | Ventas | 28000 | tramo inicial | 3 |
PARTITION BY departamentoreinicia la numeración en cada departamento.ORDER BY salario DESC, iddecide qué fila recibe cada posición.CASEcalcula una etiqueta independiente para la fila actual.- El
ORDER BYexterior organiza el resultado visible; no sustituye al orden de la ventana.
El orden de la ventana debe resolver empates
ROW_NUMBER() siempre asigna números distintos, incluso a filas con el mismo salario. Si el ORDER BY de la ventana no decide cuál va primero, el motor puede numerarlas en un orden no especificado. Añadir id como segundo criterio hace reproducible el resultado.
Decisión semántica: usa ROW_NUMBER cuando necesitas una secuencia única. Si los empates deben compartir posición, revisa RANK o DENSE_RANK; no cambies de función solo para obtener una numeración visual diferente.
Por qué necesitas una consulta exterior
Las funciones de ventana se calculan después de WHERE, GROUP BY y HAVING. Por eso el alias posicion todavía no existe cuando se procesa el WHERE del mismo nivel. La CTE crea un resultado intermedio y la consulta exterior ya puede filtrarlo.
Error frecuente: intentar filtrar la ventana en WHERE
La posición todavía no existe en ese momento lógico
SELECT nombre,
ROW_NUMBER() OVER (ORDER BY salario DESC) AS posicion
FROM empleados
WHERE posicion <= 3;Las funciones de ventana se calculan después de WHERE. Para filtrar por la posición, calcula primero la ventana en una subconsulta o CTE y filtra en la consulta exterior.
Comprueba tu dominio
- Distingues una etiqueta por fila, un resumen por grupo y un cálculo de ventana.
- Incluyes un criterio de desempate cuando necesitas posiciones reproducibles.
- Sabes explicar por qué una CTE o subconsulta permite filtrar el resultado de
ROW_NUMBER. - No prometes dos filas cuando una partición contiene solo una.
Qué debes recordar
CASEdevuelve un valor según condiciones.- Las funciones de ventana calculan sobre filas relacionadas sin colapsarlas.
- Para filtrar un resultado de ventana, utiliza una subconsulta o CTE.