Las dos trampas del window frame

¿Por qué mi total acumulado en SQL Server devuelve un número equivocado?

Cuaderno N°05 · Serie «Trucos de T-SQL para tu DW»

Por Javier Loria · Lectura ~11 min · SQL Server · Window Functions · Data Warehouse

¿Cómo hago un total acumulado en SQL Server?» es de las primeras consultas que cualquiera escribe contra un data warehouse — y una de las que más callado falla. La suma acumulada con OVER (PARTITION BY … ORDER BY …) se ve correcta y devuelve un número equivocado: incluye filas que no debería, o el LAST_VALUE devuelve la propia fila en vez del último valor del grupo. No truena; entrega un reporte que se ve bien y miente.

La causa casi siempre es la misma: la función de ventana se escribió sin definir el frame, y la diferencia entre ROWS y RANGE decide el resultado. Este cuaderno muestra las dos trampas del frame que SQL Server elige por ti, por qué pasan y cómo se corrigen con una línea.

Qué vas a encontrar:

  • El síntoma: el acumulado que «adivina el futuro» e incluye filas de más.
  • La culpable: el frame por defecto que nadie escribió (RANGE vs ROWS).
  • El patrón fino: el acumulado que excluye la fila actual.
  • Por qué LAST_VALUE no devuelve «el último» como esperabas.
  • Cómo corregir ambas con una línea de frame explícito.