Розбиття даних на вікна у віконній функції

Window Functions in Snowflake

Jake Roach

Field Data Engineer

Ранжування даних

Тут ми ранжуємо всі записи у результаті!

      user_id  |    event_name   |  km_traveled  |  closest_attendees 
      -------  | --------------- | ------------- | ----------------- 
      user_81  |  Lunar Drift    |      0.5      |         1         
      user_02  |  Lunar Drift    |      1.1      |         2       
      user_33  |  Crimson Arc    |      8.6      |         3          
      user_33  |  Neon Prophet   |      8.6      |         3         
      user_15  |  VibeStorm      |      17       |         5          
      user_94  |  The Dusk Owls  |      41       |         6        
      user_47  |  Lunar Drift    |      61       |         7   
      user_56  |  Crimson Arc    |      116      |         8         
Window Functions in Snowflake

Ранжування з розбиттям на вікна

Тепер потрібно ранжувати дані для кожного заданого вікна.

Таблиця, що ранжує відвідувачів концертів за відстанню, яку вони подолали до кожного майданчика

Window Functions in Snowflake

PARTITION BY

SELECT
    user_id,
    event_name,
    distance_traveled,

    RANK() OVER(
        -- Create window by event_name
        PARTITION BY event_name
        ORDER BY km_traveled
    ) AS closest_concert_goer

FROM CONCERTS.attendance;

PARTITION BY допомагає створювати вікна записів для застосування функцій

$$

  • PARTITION BY ставте перед ORDER BY у OVER(...)
  • Схоже на GROUP BY, але не «згортає» записи
Window Functions in Snowflake

Ранжування з розбиттям на вікна

SELECT
    level,
    price,

    RANK() OVER(
        PARTITION BY level
        ORDER BY price DESC
    ) AS price_rank

FROM CONCERTS.attendance;
  • PARTITION BY створює вікна
      level  |   price   | price_rank 
    -------- | --------- | -----------
       100   |    765    |      1
       100   |    617    |      2
       100   |    490    |      3
       100   |    490    |      3

                  ...

       200   |    212    |      1
       200   |    207    |      2

                  ...
Window Functions in Snowflake

Підсумкові метрики з FIRST_VALUE

    FIRST_VALUE(<1>) OVER(
        PARTITION BY <2>
        ORDER BY <3>
    ) AS <alias>

FIRST_VALUE допомагає знайти перше значення у вікні

`<1>`: яку колонку з запису повертати

Window Functions in Snowflake

Підсумкові метрики з AVG

AVG(<1>) OVER(
    PARTITION BY <2>
    -- No need to ORDER BY!
) AS <alias>

AVG обчислює середнє значення поля для кожного вікна

`<1>`: колонка для обчислення середнього

$$

                                                                                                                                                                                ... `ORDER BY` не потрібен!
Window Functions in Snowflake

Задоволеність клієнтів

SELECT
    user_id, event_name, satisfaction_score,

FIRST_VALUE(satisfaction_score) OVER( PARTITION BY event_name -- Satisfaction score for the closest concert-goer ORDER BY km_traveled ) AS first_score,
-- Find the average satisfcation score for a "window" of records AVG(satisfaction_score) OVER( PARTITION BY event_name ) AS average_score
FROM CONCERTS.attendance;
Window Functions in Snowflake

Задоволеність клієнтів


      user_id  |   event_name   |  satisfaction_score  |  first_score  |  average_score 
     --------- | -------------- | -------------------- | ------------- | ---------------

      user_26  |  Pulse Theory  |          71          |       98      |      84.5      
      user_92  |  Pulse Theory  |          98          |       98      |      84.5      

                                          ...

      user_57  |   Nova Sway    |           4          |       22      |      29.3      
      user_39  |   Nova Sway    |          22          |       22      |      29.3      
      user_44  |   Nova Sway    |          62          |       22      |      29.3      

                                          ...
Window Functions in Snowflake

Давайте потренуємось!

Window Functions in Snowflake

Preparing Video For Download...