Window Functions ใน Snowflake
Jake Roach
Field Data Engineer
ตอนนี้กำลังจัดอันดับทุก record ในผลลัพธ์!
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 ที่กำหนด

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 ช่วยสร้าง window ของ record เพื่อนำฟังก์ชันไปใช้
$$
PARTITION BY ต้องอยู่ก่อน ORDER BY ใน OVER(...)GROUP BY แต่ไม่ "ยุบ" recordSELECT
level,
price,
RANK() OVER(
PARTITION BY level
ORDER BY price DESC
) AS price_rank
FROM CONCERTS.attendance;
PARTITION BY สร้าง window level | price | price_rank
-------- | --------- | -----------
100 | 765 | 1
100 | 617 | 2
100 | 490 | 3
100 | 490 | 3
...
200 | 212 | 1
200 | 207 | 2
...
FIRST_VALUE(<1>) OVER(
PARTITION BY <2>
ORDER BY <3>
) AS <alias>
FIRST_VALUE ใช้หาค่าแรกใน window
<1>: คอลัมน์ที่ต้องการคืนค่า
<2>: field สำหรับแบ่งพาร์ติชัน
<3>: field สำหรับกำหนด record แรก
AVG(<1>) OVER(
PARTITION BY <2>
-- No need to ORDER BY!
) AS <alias>
AVG หาค่าเฉลี่ยของ field ในแต่ละ window
<1>: คอลัมน์ที่ต้องการหาค่าเฉลี่ย
<2>: field สำหรับแบ่งพาร์ติชัน
$$
... ไม่จำเป็นต้องใช้ ORDER BY!
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_scoreFROM CONCERTS.attendance;
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 ใน Snowflake