다음 SQL 의 실행 결과로 옳은 것은?[예매]예매번호회원번호금액상태1… | [SQLD] SQL 개발자 기출유형 모의고사 9회 상세 페이지
1[SQLD] SQL 개발자 기출유형 모의고사 9회
다음 SQL 의 실행 결과로 옳은 것은?[예매]
| 예매번호 | 회원번호 | 금액 | 상태 |
|---|---|---|---|
| 1 | 7 | 15000 | 완료 |
| 2 | 7 | 12000 | 취소 |
| 3 | 7 | 9000 | 완료 |
| 4 | 8 | 20000 | 취소 |
| 5 | 8 | 11000 | 완료 |
| 6 | 8 | 11000 | 완료 |
| 7 | 9 | 8000 | 완료 |
SELECT 회원번호, 예매번호, 금액
FROM (SELECT 회원번호, 예매번호, 금액, 상태,
ROW_NUMBER() OVER (PARTITION BY 회원번호
ORDER BY 금액 DESC, 예매번호) AS RN
FROM 예매) T
WHERE RN <= 2
AND 상태 = '완료'
ORDER BY 회원번호, 예매번호;1
| 회원번호 | 예매번호 | 금액 |
|---|---|---|
| 7 | 1 | 15000 |
2
| 회원번호 | 예매번호 | 금액 |
|---|---|---|
| 7 | 1 | 15000 |
| 8 | 5 | 11000 |
| 9 | 7 | 8000 |
3
| 회원번호 | 예매번호 | 금액 |
|---|---|---|
| 7 | 1 | 15000 |
| 8 | 5 | 11000 |
| 8 | 6 | 11000 |
| 9 | 7 | 8000 |
4
| 회원번호 | 예매번호 | 금액 |
|---|---|---|
| 7 | 1 | 15000 |
| 7 | 3 | 9000 |
| 8 | 5 | 11000 |
| 8 | 6 | 11000 |
| 9 | 7 | 8000 |
해설
ROW_NUMBER 는 인라인 뷰 안에서 취소 건까지 포함해 회원별로 매겨지고, 상태 조건은 그 뒤 바깥 WHERE 에서 적용되므로 결과는 3행이다.
회원 7 은 1·2위가 예매 1·2 인데 2 가 취소라 1 만, 회원 8 은 1위 4 가 취소라 2위 5 만, 회원 9 는 7 만 남는다.
- 5행 표는 취소 건을 먼저 거른 뒤 순번을 매긴 결과이다.
- 회원 8 이 두 행인 표는 보조 정렬 예매번호를 무시하고 동점 11000 을 같은 순위로 본 결과이다.
- 1행 표는 PARTITION BY 없이 전체 상위 2건만 본 결과이다.
오류나 개정된 내용이 보이면 알려주세요