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

ROW_NUMBER, RANK, CTE

~14 min · queries, advanced

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

세 ranking 함수

파티션 안에서 숫자 할당하는 세 window 함수. 동점 처리 차이:

  • ROW_NUMBER() — 유일 순차, 동점 없음 (1, 2, 3, 4).
  • RANK() — 동점이 같은 rank 공유, 그 다음 skip (1, 2, 2, 4).
  • DENSE_RANK() — 동점이 같은 rank, skip 없음 (1, 2, 2, 3).

Top-N per group

고전 응용: "고객당 가장 최근 3 주문 보여줘". ROW_NUMBER 있는 subquery + WHERE rn <= 3. 이 단일 패턴이 평생 만들 거의 모든 대시보드에 등장.

Readable layered 쿼리 위한 CTE

CTE (Common Table Expression, WITH 절) 가 쿼리 상단에 정의된 named subquery. 깊이 중첩된 쿼리를 named, readable step 으로. 다중 CTE 체인 가능. Recursive CTE 가 트리 traverse.

Code

ROW_NUMBER 로 top-N per group·sql
SELECT *
FROM (
  SELECT o.*,
         ROW_NUMBER() OVER (
           PARTITION BY o.customer_id
           ORDER BY o.placed_at DESC
         ) AS rn
  FROM orders o
) ranked
WHERE rn <= 3;
Multi-CTE 파이프라인·sql
WITH active_users AS (
  SELECT DISTINCT user_id
  FROM   orders
  WHERE  placed_at >= now() - INTERVAL '90 days'
),
user_spend AS (
  SELECT user_id, SUM(total) AS total_spent
  FROM   orders
  WHERE  user_id IN (SELECT user_id FROM active_users)
  GROUP  BY user_id
)
SELECT u.name, us.total_spent
FROM   user_spend us
JOIN   users u ON u.id = us.user_id
ORDER  BY us.total_spent DESC
LIMIT  10;
Recursive CTE — 트리 traverse·sql
-- 조직도: 모든 직원 + 루트로부터 깊이
WITH RECURSIVE org AS (
  SELECT id, name, manager_id, 1 AS depth
  FROM   employees
  WHERE  manager_id IS NULL
  UNION ALL
  SELECT e.id, e.name, e.manager_id, o.depth + 1
  FROM   employees e
  JOIN   org o ON e.manager_id = o.id
)
SELECT REPEAT('  ', depth-1) || name AS tree, depth
FROM   org
ORDER  BY depth, name;

External links

Exercise

고객당 top 3 주문 by total 반환 쿼리, ranking 엔 CTE + presentation 엔 final SELECT. 보너스: self-referential 'category parent' 트리 walk 하는 recursive CTE 추가.

Progress

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

댓글 0

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

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