0Pricing
SQL Interview Prep · Lección

Sumas acumuladas con marcos de ventana

Cree un total acumulado usando SUM OVER con un marco ordenado

Sumas acumuladas con marcos de ventana es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.

La pregunta sobre el total acumulado

Casi todas las entrevistas para analistas incluyen alguna variante de: «Muéstreme los ingresos acumulados a lo largo del tiempo». Un total acumulado es una suma que crece fila a fila y acumula todo desde el inicio hasta la fila actual.

Antes de que existieran las funciones de ventana, los candidatos resolvían esto con una autocombinación lenta o una subconsulta correlacionada. La respuesta moderna y esperada es SUM(...) OVER (ORDER BY ...). Conocer la versión basada en marcos de ventana demuestra que entiende el SQL escrito desde aproximadamente 2012.

Anatomía de una suma de ventana ordenada

Un total acumulado no es más que una función de agregación convertida en una función de ventana. Se conserva SUM(amount), pero se añade una cláusula OVER con un ORDER BY.

El ORDER BY dentro de OVER es lo que la convierte en acumulativa: indica a SQL que acumule las filas siguiendo esa secuencia. Sin un ORDER BY, SUM calcularía el total de toda la partición para cada fila en lugar de ir creciendo.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (ORDER BY sale_date) AS running_total
FROM sales
ORDER BY sale_date;

Por qué ORDER BY implica un marco

Este es el detalle que a los entrevistadores les encanta comprobar: cuando añade ORDER BY a una función de agregación de ventana, SQL aplica un marco predeterminado de RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

Ese valor predeterminado es precisamente lo que produce un total acumulado: cada fila desde el inicio de la partición hasta la fila actual, incluida. Si entiende este valor predeterminado, entiende por qué la suma acumulativa «funciona sin más».

Hacer explícito el marco

Puede escribir el marco manualmente. Estas dos consultas devuelven el mismo resultado, pero la versión explícita demuestra al entrevistador que sabe qué ocurre internamente.

Escribir ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW es la forma explícita más segura para un total acumulado porque cuenta filas físicas y evita las sorpresas de agrupación por valores de RANGE (que se explican en la próxima lección).

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS running_total
FROM sales;

Ejemplo resuelto: ventas diarias

Imagine cuatro días de ventas: lunes 100, martes 50, miércoles 200 y jueves 75. El total acumulado aumenta de izquierda a derecha.

  • Lun: 100
  • Mar: 100 + 50 = 150
  • Mié: 150 + 200 = 350
  • Jue: 350 + 75 = 425

La última fila siempre equivale al total general. Esta es una comprobación rápida de coherencia que puede mencionar en una entrevista: el último valor del total acumulado debe coincidir con SUM(amount) calculado sobre todo el conjunto.

Reiniciar por grupo con PARTITION BY

Las preguntas reales suelen pedir un total acumulado por cliente o por región, no un único total global. Añada PARTITION BY y la acumulación se reiniciará al principio de cada partición.

El modelo mental es el siguiente: PARTITION BY divide las filas en grupos independientes, y la combinación de ORDER BY y el marco se ejecuta por separado dentro de cada grupo.

SELECT
  customer_id,
  sale_date,
  amount,
  SUM(amount) OVER (
    PARTITION BY customer_id
    ORDER BY sale_date
  ) AS customer_running_total
FROM sales;

La trampa de los empates

Si dos filas comparten el mismo valor de ORDER BY (dos ventas en la misma fecha), el marco predeterminado RANGE las trata como filas con el mismo valor y les asigna el mismo total acumulado, incluidos ambos importes.

Si necesita un incremento estrictamente fila a fila incluso cuando haya empates, cambie al marco ROWS y añada un criterio de desempate único al ORDER BY, como sale_date, id. Los entrevistadores incluyen fechas duplicadas deliberadamente para comprobar si se da cuenta.

SELECT
  sale_date,
  amount,
  SUM(amount) OVER (
    ORDER BY sale_date, id
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  ) AS running_total
FROM sales;

Total acumulado de un recuento

La lógica acumulativa no se limita a SUM. Cualquier función de agregación puede utilizarse como función de ventana, por lo que puede crear un recuento, un promedio o un máximo acumulado.

El recuento acumulado de pedidos es una métrica habitual en los paneles: ¿cuántos pedidos hemos recibido hasta cada día?

SELECT
  order_date,
  COUNT(*) OVER (
    ORDER BY order_date
  ) AS orders_to_date
FROM orders;

La forma antigua: subconsulta correlacionada

A veces los entrevistadores le piden resolver un total acumulado sin funciones de ventana para evaluar la profundidad de sus conocimientos. La solución clásica anterior a las ventanas es una subconsulta correlacionada que vuelve a sumar todas las filas anteriores.

Funciona, pero es O(n al cuadrado): para cada fila vuelve a recorrer la tabla. Menciónelo para demostrar que sabe por qué las funciones de ventana la sustituyeron.

SELECT
  s.sale_date,
  s.amount,
  (SELECT SUM(s2.amount)
   FROM sales s2
   WHERE s2.sale_date <= s.sale_date) AS running_total
FROM sales s
ORDER BY s.sale_date;

Filtrado frente al resultado de la ventana

Una pregunta de seguimiento frecuente es: «Muestre solo los días en los que el total acumulado superó 1000». No puede poner una función de ventana en WHERE porque el marco se calcula después de que se ejecuta WHERE.

La solución consiste en calcular el total acumulado en una CTE o subconsulta y filtrar después en la consulta externa. Esta es la misma regla de envolver la consulta que se aplica a todas las funciones de ventana.

WITH t AS (
  SELECT
    sale_date,
    SUM(amount) OVER (ORDER BY sale_date) AS running_total
  FROM sales
)
SELECT *
FROM t
WHERE running_total >= 1000;

Puntos clave para la entrevista

Cuando presente una respuesta sobre totales acumulados, explique estos puntos para obtener la máxima puntuación:

  • SUM OVER (ORDER BY ...) es la forma acumulativa.
  • Añadir ORDER BY crea un marco predeterminado desde UNBOUNDED PRECEDING hasta CURRENT ROW.
  • Use PARTITION BY para reiniciar la acumulación por grupo.
  • Añada un criterio de desempate único y un marco ROWS para evitar la trampa de los valores duplicados.
  • Envuelva la consulta en una CTE para filtrar el resultado.

Comprobación rápida

Compruebe su comprensión del marco predeterminado.

Resumen: sumas acumulativas

Un total acumulado es una función de agregación de ventana ordenada. SUM(amount) OVER (ORDER BY sale_date) acumula las filas desde el inicio de la partición hasta la fila actual gracias al marco implícito desde UNBOUNDED PRECEDING hasta CURRENT ROW.

Reinícielo por grupo con PARTITION BY, añada un criterio de desempate y un marco ROWS para gestionar los valores de ordenación duplicados, y envuélvalo en una CTE siempre que necesite filtrar por el valor acumulado. A continuación, analizaremos la diferencia entre ROWS y RANGE que se insinuó en esta lección.

Preguntas frecuentes

¿La lección «Sumas acumuladas con marcos de ventana» es gratis?

Sí — el texto completo de «Sumas acumuladas con marcos de ventana» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «Sumas acumuladas con marcos de ventana»?

Cree un total acumulado usando SUM OVER con un marco ordenado Practicas SQL Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar SQL Interview Prep?

No se requiere experiencia previa. SQL Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Sumas acumuladas con marcos de ventana»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de SQL Interview Prep?

Sí. Cada lección de SQL Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Sumas acumuladas con marcos de ventana
  2. Marcos ROWS frente a RANGE
  3. Medias móviles en una ventana deslizante
  4. Distribución acumulada y porcentaje del total
← Volver a SQL Interview Prep