Okenní rámce

Window Functions ve Snowflake

Jake Roach

Field Data Engineer

Okenní rámce

Výstup zobrazující okno tvořené všemi záznamy.

Window Functions ve Snowflake

Okenní rámce

Výstup zobrazující okna vytvořená pomocí pole member_id k rozdělení záznamů.

Window Functions ve Snowflake

Dynamické okenní rámce

Výstup zobrazující "klouzající" okenní rámec.

Window Functions ve Snowflake

Průběžný výpočet

SELECT
    ...

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

        -- Okno mezi prvním
        -- a aktuálním řádkem

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) ...

ROWS BETWEEN umožňuje vytvořit dynamický okenní rámec

  • UNBOUNDED PRECEEDING AND CURRENT ROW
  • Od prvního řádku sekvence po aktuální
  • „Průběžný" výpočet, nikoli klouzavý
  • CURRENT ROW AND UNBOUNDED FOLLOWING

$$

<1>: pole, ze kterého se výpočet provádí

<2>: seřadí výsledky, definuje okenní rámec

Window Functions ve Snowflake

Průběžný součet spálených kalorií

SELECT
    member_id AS m_id, 
    calories_burned AS cb,

    -- Running total!
    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  

Window Functions ve Snowflake

CURRENT ROW AND UNBOUNDED FOLLOWING

SELECT
    member_id AS m_id, 
    calories_burned AS cb,

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

        -- Okno od aktuálního řádku do posledního

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  

Window Functions ve Snowflake

Trendy spalování kalorií

SELECT
    member_id,
    workout_date,
    calories_burned,

    AVG(calories_burned) OVER(   -- Průběžný průměr spálených kalorií
        PARTITION BY member_id

        -- Okno dle data tréninku, od prvního do aktuálního
        ORDER BY workout_date
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

    ) AS avg_calories_burned

FROM FITNESS.workouts;
Window Functions ve Snowflake

Trendy spalování kalorií


            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

Window Functions ve Snowflake

Pojďme si procvičit!

Window Functions ve Snowflake

Preparing Video For Download...