리포트를 query 하나로 만드는 고급 SQL
Window function은 지금 row와 관련된 row들을 훑어서 값을 계산하되, 그룹으로 접지는 않아. CTE(Common Table Expression)는 subquery에 이름을 붙여 재사용하게 해주고, 재귀 CTE는 계층 데이터를 다뤄.
window function은 이런 모양들로 써.
row_number() OVER (ORDER BY ...)— 정렬 순서대로 번호를 매겨.rank()와dense_rank()— 대회식 순위를 매겨.sum(...) OVER (...)와avg(...) OVER (...)— 누적 합이나 이동 평균을 내.lag(col)과lead(col)— 앞뒤 row의 값을 끌어와.partition by— 구간마다 window를 처음부터 다시 시작해.
Tip: SQLite에서 계층을 다루는 만능 도구는 재귀 CTE야. 조직도, 파일 트리, 댓글 타래에 다 써. 모양은 늘
WITH RECURSIVE name AS (anchor UNION ALL recursive_step) SELECT ...야. 이 패턴이 몸에 붙으면 앱 쪽에서 트리를 순회하던 코드를 상당 부분 걷어낼 수 있어.