0Pricing
SQL Interview Prep · Lección

Cambio entre periodos

Calcule el crecimiento intermensual y las variaciones interdiarias con LAG

Cambio entre periodos es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 2 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 segura para analistas

Si se entrevista para un puesto de analista de datos, espere preguntas como: «Calcule el crecimiento intermensual» o «¿Cuál es el cambio interdiario?» Es prácticamente inevitable.

El elemento básico es LAG: obtenga el valor del periodo anterior y, después, calcule una diferencia absoluta o un cambio porcentual. En esta lección convertirá LAG en los patrones de comparación entre periodos que los entrevistadores evalúan.

Cambio absoluto con LAG

La versión más sencilla es la diferencia sin procesar entre este periodo y el anterior. Obtenga el valor anterior con LAG y réstelo directamente.

La primera fila según el orden no tiene una predecesora, por lo que su cambio es NULL. Esto es correcto, no un error: realmente no existe un periodo anterior con el que compararla.

SELECT
  month,
  revenue,
  revenue - LAG(revenue) OVER (ORDER BY month) AS mom_change
FROM monthly_sales
ORDER BY month;

Cambio porcentual

Los entrevistadores suelen pedir el crecimiento expresado como porcentaje. La fórmula es (actual - anterior) / anterior, multiplicada por 100. Exprésela directamente con LAG.

Preste atención al orden de las operaciones y a los paréntesis; colocar uno incorrectamente es un error clásico cuando se trabaja bajo presión.

SELECT
  month,
  revenue,
  100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
        / LAG(revenue) OVER (ORDER BY month) AS pct_growth
FROM monthly_sales
ORDER BY month;

Evite la división entera

Una trampa en la que caen muchos candidatos: si revenue es un entero, (110 - 100) / 100 se evalúa como 0 en las bases de datos que realizan división entera.

Multiplique por 100.0 (un literal de tipo float) o convierta primero el valor a decimal con CAST para forzar las operaciones en coma flotante. Mencionarlo de forma proactiva demuestra atención al detalle.

SELECT
  month,
  ROUND(
    100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
          / LAG(revenue) OVER (ORDER BY month), 2
  ) AS pct_growth
FROM monthly_sales;

Más limpio: calcular una vez en una CTE

Llamar a LAG dos veces (para el numerador y el denominador) es repetitivo y facilita cometer errores tipográficos. Una refactorización habitual consiste en calcular el valor anterior una sola vez en una CTE y realizar después la aritmética en la consulta externa.

Esto se entiende mejor en una entrevista con pizarra y evita que las dos llamadas a LAG diverjan.

WITH t AS (
  SELECT
    month,
    revenue,
    LAG(revenue) OVER (ORDER BY month) AS prev
  FROM monthly_sales
)
SELECT
  month,
  revenue,
  ROUND(100.0 * (revenue - prev) / prev, 2) AS pct_growth
FROM t;

Evite la división entre cero

Si el valor del periodo anterior puede ser 0, la fórmula del porcentaje divide entre cero y produce un error. Utilice NULLIF(prev, 0) para que el denominador se convierta en NULL y el resultado sea NULL en lugar de producir una excepción.

Esta pequeña precaución al dividir es un detalle de programación defensiva que los entrevistadores valoran en candidatos con mentalidad de producción.

SELECT
  month,
  revenue,
  100.0 * (revenue - prev) / NULLIF(prev, 0) AS pct_growth
FROM (
  SELECT month, revenue,
         LAG(revenue) OVER (ORDER BY month) AS prev
  FROM monthly_sales
) s;

Comparación entre periodos por grupo

La mayoría de las preguntas reales tienen un ámbito concreto: crecimiento intermensual por producto o por región. Añada PARTITION BY para que la serie de cada grupo se compare únicamente consigo misma.

El primer mes de cada grupo se reinicia en NULL y nunca se compara entre los límites de los productos.

SELECT
  product_id,
  month,
  revenue,
  revenue - LAG(revenue) OVER (
    PARTITION BY product_id
    ORDER BY month
  ) AS mom_change
FROM product_sales;

Comparación interanual con desplazamiento

Para calcular la comparación interanual con datos mensuales en los que las filas están separadas por un mes, compare con el valor situado 12 filas atrás. El argumento de desplazamiento lo hace directamente: LAG(revenue, 12).

Esto supone que hay una fila por mes y que no existen intervalos vacíos. Si pueden faltar meses, tendría que unir las filas mediante una fecha explícita, un matiz que conviene mencionar en voz alta.

SELECT
  month,
  revenue,
  revenue - LAG(revenue, 12) OVER (ORDER BY month) AS yoy_change
FROM monthly_sales
ORDER BY month;

Agregue antes de comparar

Las tablas de eventos sin procesar no están previamente sumadas por mes. Una solución realista primero agrega los datos para obtener una fila por periodo y, después, aplica LAG al resultado agregado, normalmente mediante una CTE.

Intentar aplicar LAG sobre filas sin agregar compara transacciones individuales, no totales mensuales: es un error lógico frecuente.

WITH monthly AS (
  SELECT DATE_TRUNC('month', order_date) AS mth,
         SUM(amount) AS revenue
  FROM orders
  GROUP BY 1
)
SELECT mth, revenue,
       revenue - LAG(revenue) OVER (ORDER BY mth) AS mom_change
FROM monthly
ORDER BY mth;

Interpretar el primer NULL

A veces los entrevistadores preguntan: «¿Por qué el crecimiento de la primera fila es NULL y es aceptable?». La respuesta correcta es que no existe un periodo anterior, por lo que el cambio no está definido, y NULL lo representa correctamente.

Si el negocio quiere 0 en su lugar, utilizaría LAG(revenue, 1, 0) o COALESCE, pero solo si eso coincide con el significado previsto.

Etiquetar la dirección del crecimiento

A veces los entrevistadores amplían la pregunta: «Indique también si cada mes creció, disminuyó o se mantuvo estable». Envuelva la comparación con LAG en una expresión CASE.

Comparar con el valor anterior proporciona una columna de tendencia clara y legible, además de la diferencia numérica, y muestra correctamente NULL o una etiqueta predeterminada para el primer periodo, que no tiene comparación.

SELECT
  month,
  revenue,
  CASE
    WHEN revenue > LAG(revenue) OVER (ORDER BY month) THEN 'up'
    WHEN revenue < LAG(revenue) OVER (ORDER BY month) THEN 'down'
    ELSE 'flat'
  END AS trend
FROM monthly_sales
ORDER BY month;

Comprobación rápida

Detecte el error común en las consultas de cambio porcentual.

Repaso

El cambio entre periodos es LAG más aritmética:

  • Cambio absoluto: value - LAG(value) OVER (ORDER BY period).
  • Cambio porcentual: 100.0 * (value - prev) / NULLIF(prev, 0).
  • Fuerce las operaciones en coma flotante, evite la división entre cero y agregue previamente los datos para obtener una fila por periodo.
  • Defina el ámbito con PARTITION BY y utilice el desplazamiento para la comparación interanual.

A continuación: dividir las filas en segmentos y niveles con NTILE.

Preguntas frecuentes

¿La lección «Cambio entre periodos» es gratis?

Sí — el texto completo de «Cambio entre periodos» 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 «Cambio entre periodos»?

Calcule el crecimiento intermensual y las variaciones interdiarias con LAG 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 2 de 4.

¿Cuánto tiempo toma la lección «Cambio entre periodos»?

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. LAG y LEAD para filas adyacentes
  2. Cambio entre periodos
  3. NTILE para crear grupos
  4. FIRST_VALUE, LAST_VALUE y límites del marco
← Volver a SQL Interview Prep