Marcos de ventana

Funciones de ventana en Snowflake

Jake Roach

Field Data Engineer

Marcos de ventana

Salida que muestra una ventana compuesta por todos los registros.

Funciones de ventana en Snowflake

Marcos de ventana

Salida que muestra ventanas construidas usando el campo member_id para particionar registros.

Funciones de ventana en Snowflake

Marcos de ventana dinámicos

Salida que muestra un marco de ventana "deslizante".

Funciones de ventana en Snowflake

Encontrar un cálculo acumulado

SELECT
    ...

    AVG(<1>) OVER(
        PARTITION BY ...
        ORDER BY <2>

        -- Ventana entre la primera
        -- y la fila actual

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) ...

ROWS BETWEEN nos permite crear un marco de ventana dinámico

  • UNBOUNDED PRECEEDING AND CURRENT ROW
  • Primera fila en secuencia hasta la fila actual
  • Cálculo "acumulado", no rodante
  • CURRENT ROW AND UNBOUNDED FOLLOWING

$$

<1>: campo para calcular

<2>: secuencia resultados, construye marco de ventana

Funciones de ventana en Snowflake

Total acumulado de calorías quemadas

SELECT
    member_id AS m_id, 
    calories_burned AS cb,

    -- ¡Total acumulado!
    SUM(calories_burned) OVER(
        PARTITION BY member_id
        ORDER BY workout_date

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_total FROM fitness.workouts;

         m_id  |    cb   |  running_total
       ------- | ------- | --------------
        m_192  |   105   |      105 
        m_192  |   156   |      261 
        m_192  |    69   |      330 
        m_192  |   102   |      432  

        m_74   |   374   |      374  
        m_74   |   396   |      770  
        m_74   |   504   |     1274  

        m_233  |    51   |       51  
        m_233  |    81   |      132  

Funciones de ventana en Snowflake

FILA ACTUAL Y SIN LÍMITE POSTERIOR

SELECT
    member_id AS m_id, 
    calories_burned AS cb,

    SUM(calories_burned) OVER(
        PARTITION BY member_id
        ORDER BY workout_date

        -- Ventana entre la fila actual y la última

ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) AS left_to_burn FROM fitness.workouts;

         m_id  |    cb   |  left_to_burn
       ------- | ------- | --------------
        m_192  |   105   |      432 
        m_192  |   156   |      327 
        m_192  |    69   |      171 
        m_192  |   102   |      102  

        m_74   |   374   |     1274  
        m_74   |   396   |      900 
        m_74   |   504   |      504  

        m_233  |    51   |      132  
        m_233  |    81   |       81  

Funciones de ventana en Snowflake

Tendencias de quema de calorías

SELECT
    member_id,
    workout_date,
    calories_burned,

    AVG(calories_burned) OVER(   -- Promedio acumulado de calorías quemadas
        PARTITION BY member_id

        -- Crear una ventana por fecha de entrenamiento, desde el primer entrenamiento hasta el actual
        ORDER BY workout_date
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

    ) AS avg_calories_burned

FROM FITNESS.workouts;
Funciones de ventana en Snowflake

Tendencias de quema de calorías


            member_id  |  workout_date  |  calories_burned  |  average_calories_burned
           ----------- | -------------- | ----------------- | -------------------------
              m_192    |   2025-01-01   |        105        |          105.0
              m_192    |   2025-01-03   |        156        |          130.5
              m_192    |   2025-01-04   |         69        |          110.0
              m_192    |   2025-01-10   |        102        |          108.0

               m_74    |   2025-02-10   |        374        |          374.0
               m_74    |   2025-02-13   |        396        |          385.0
               m_74    |   2025-02-14   |        504        |          426.7

              m_233    |   2025-03-05   |         51        |           51.0
              m_233    |   2025-03-12   |         81        |           66.0

Funciones de ventana en Snowflake

¡Vamos a practicar!

Funciones de ventana en Snowflake

Preparing Video For Download...