Repaso integrado · URL histórica conservada

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.

30–35 minNivel intermedioAntes necesitas: CASE, ORDER BY y funciones de ventana

Al terminar, podrás

  • Distinguir un cálculo condicional de un cálculo sobre filas relacionadas.
  • Combinar CASE y ROW_NUMBER en el mismo resultado.
  • Reconocer por qué el orden dentro de OVER debe 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

NecesidadHerramientaFilas finales
Asignar una etiqueta según la filaCASEUna por fila de entrada
Resumir un departamentoGROUP BY y agregadosUna por grupo
Comparar o numerar dentro del departamentoFunción de ventanaSe 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.

SQL
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;
Fragmento del resultado
nombredepartamentosalariotramoposicion
Gonzalo NietoMarketing31500tramo inicial1
Helena CostaMarketing30000tramo inicial2
Carlos PeñaTecnología46000tramo alto1
Diana LeónTecnología39000tramo alto2
Ismael DíazVentas36000tramo alto1
Alex RamosVentas33000tramo inicial2
Bea MolinaVentas28000tramo inicial3
  1. PARTITION BY departamento reinicia la numeración en cada departamento.
  2. ORDER BY salario DESC, id decide qué fila recibe cada posición.
  3. CASE calcula una etiqueta independiente para la fila actual.
  4. El ORDER BY exterior 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

  • CASE devuelve 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.

Recorrido recomendado

Fuentes técnicas consultadas