분석 함수는 `OVER` 절로 계산 범위를 지정합니다. PARTITION BY로 묶고, ORDER BY로 순서를 정한 뒤, 각 함수가 어떤 방식으로 값을 계산하는지 보는 구조로 접근하면 훨씬 쉬워집니다.
핵심 체크포인트
- 윈도우 함수는 원본 행 수를 유지합니다.
- OVER 안의 PARTITION BY와 ORDER BY 의미를 먼저 읽어야 합니다.
- 순위 함수와 누적 함수, 이전/다음 행 참조 함수를 나눠서 익히면 좋습니다.
주제별 설명
OVER
분석 함수가 어떤 범위에서 계산될지 지정하는 핵심 절입니다.
- OVER가 없으면 윈도우 함수 문법이 성립하지 않습니다.
- PARTITION BY와 ORDER BY를 생략할 수도 있지만 의미가 크게 달라집니다.
PARTITION BY
윈도우 함수를 계산할 그룹 경계를 나누는 절입니다.
- GROUP BY처럼 묶지만 행을 줄이지 않는다는 점이 다릅니다.
- 부서별, 등급별, 고객별 순위 계산에서 매우 자주 사용됩니다.
ORDER BY (분석)
각 파티션 안에서 계산 순서를 정하는 절입니다.
- 순위, 누계, 이전/다음값 계산은 이 순서에 크게 의존합니다.
- 일반 ORDER BY와 달리 OVER 안에 들어가면 계산 기준이 됩니다.
ROW_NUMBER
정렬 기준에 따라 각 행에 유일한 순번을 매깁니다.
- 동점이어도 번호가 겹치지 않습니다.
- 상위 N개 추출, 최신 1건 찾기 패턴에서 자주 사용됩니다.
SELECT member_id,
member_name,
ROW_NUMBER() OVER (ORDER BY joined_at DESC) AS join_rank
FROM members;RANK / DENSE_RANK
동점 순위를 부여하되, 다음 순번을 건너뛸지 여부가 다른 함수입니다.
- RANK는 동점 뒤 순번이 건너뛰고, DENSE_RANK는 빈 순번 없이 이어집니다.
- 시험에서는 둘의 결과 차이를 묻는 문제가 자주 나옵니다.
LAG / LEAD
이전 행 값과 다음 행 값을 현재 행 옆에 붙이는 함수입니다.
- 전월 대비, 이전 상태 비교, 다음 일정 조회 같은 흐름에 유용합니다.
- SELF JOIN 없이도 인접 행 비교를 간단히 만들 수 있습니다.
FIRST_VALUE / LAST_VALUE
윈도우 범위 기준으로 첫 값과 마지막 값을 가져오는 함수입니다.
- 현재 행 기준이 아니라 윈도우 프레임 기준이라는 점을 함께 봐야 합니다.
- ORDER BY와 프레임 범위 설정에 따라 결과가 달라질 수 있습니다.
SUM() OVER / AVG() OVER
누계, 이동 평균, 그룹 평균을 원본 행과 함께 표시할 때 사용하는 패턴입니다.
- GROUP BY 없이도 각 행 옆에 요약 값을 함께 보여줄 수 있습니다.
- 상세 행과 집계 값을 한 화면에 보여줘야 할 때 특히 강력합니다.
실습 흐름 추천
- ROW_NUMBER로 순번부터 확인하며 OVER 문법에 익숙해집니다.
- PARTITION BY를 붙여 그룹별 순위로 확장합니다.
- LAG, LEAD, SUM OVER로 이전값 비교와 누계 계산까지 이어가면 실전 감각이 빨리 붙습니다.
바로 이어서 해보려면
이론만 읽지 말고 바로 blacksql.sqld.kr에서 실행해보고, 문제 풀이 감각은 www.sqld.kr에서 이어가면 학습 속도가 훨씬 빨라집니다.
자주 묻는 질문
GROUP BY는 행을 줄여 요약하지만, 분석 함수는 행을 유지한 채 각 행 옆에 계산 결과를 붙입니다.
OVER 안의 PARTITION BY와 ORDER BY가 어떤 그룹과 어떤 순서를 의미하는지부터 해석하면 대부분 풀립니다.