문제
다음 [성적] 테이블에서 SQL문을 실행했을 때, 이름이 '이'인 행의 prev_score 값을 쓰시오.
| 이름 | 학년 | 점수 |
|---|---|---|
| 김 | 1 | 80 |
| 이 | 1 | 90 |
| 박 | 1 | 85 |
| 최 | 2 | 75 |
| 정 | 2 | 95 |
SQLSELECT 이름, 학년, 점수, LAG(점수, 1, 0) OVER (PARTITION BY 학년 ORDER BY 이름) AS prev_score FROM 성적;
정답
80
80
해설
- PARTITION BY 학년으로 1학년과 2학년이 각각 분할됩니다.
- ORDER BY 이름으로 이름을 가나다 순으로 정렬하면, 1학년 파티션에서는 김 → 이 → 박 순으로 정렬됩니다.
- LAG(점수, 1, 0)는 현재 행의 이전 행에서 점수 값을 가져오며, 이전 행이 없으면 기본값 0을 반환합니다.
- 이름이 '이'인 행은 1학년 파티션에서 두 번째 위치(김 → 이)에 있으므로, 이전 행은 '김'입니다.
- 따라서 '이'의 prev_score는 이전 행인 '김'의 점수인 80이 됩니다.