C.W.K.
Stream
Lesson 15 of 16 · published

Window 함수

~14 min · queries, windows

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

Collapse 안 하는 aggregate

GROUP BY 가 행을 summary 로 collapse. Window 함수가 collapse 없이 행 너머로 계산 — 모든 행이 정체성 유지하면서 계산값 얻음. 각 행 여백에 메모 쓰는 거라고 생각.

OVER 절

SUM(total) OVER (PARTITION BY user_id ORDER BY placed_at): 각 행에 대해, 같은 user 파티션의 현재 행까지 모든 행의 total 합 (running total). ORDER BY 없으면 모든 행에 파티션당 total. PARTITION BY 가 GROUP BY 같지만 collapse 안 함.

Frame 절

Moving average 같은 sliding window 엔 frame 추가: ROWS BETWEEN 6 PRECEDING AND CURRENT ROW. 현재 행 + 이전 6 개 — 7-행 moving average.

Code

Running total 와 고객당 평균·sql
-- 고객당 running total
SELECT u.name, o.placed_at, o.total,
       SUM(o.total) OVER (
         PARTITION BY u.id
         ORDER BY o.placed_at
       ) AS running_total
FROM   users u
JOIN   orders o ON o.user_id = u.id
ORDER  BY u.name, o.placed_at;
고객 평균과의 차이·sql
SELECT u.name, o.total,
       AVG(o.total) OVER (PARTITION BY u.id)         AS customer_avg,
       o.total - AVG(o.total) OVER (PARTITION BY u.id) AS diff_from_avg
FROM   users u
JOIN   orders o ON o.user_id = u.id;
이동 7-일 평균·sql
SELECT date, revenue,
       AVG(revenue) OVER (
         ORDER BY date
         ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
       ) AS moving_avg_7d
FROM daily_revenue
ORDER BY date;
재사용 위한 named window·sql
SELECT id, customer_id, total,
       SUM(total)   OVER w  AS running_total,
       AVG(total)   OVER w  AS running_avg,
       COUNT(*)     OVER w  AS running_count
FROM   orders
WINDOW w AS (PARTITION BY customer_id ORDER BY placed_at);

External links

Exercise

각 유저의 가장 최근 3 주문 + 평생 spend running total 반환 쿼리. running total 엔 window 함수, 유저당 제한엔 ROW_NUMBER (다음 레슨).

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.