✔️ 문제
레스토랑의 매니저는 요일 별로 큰 금액을 결제한 영수증을 찾고 싶습니다. 요일 별 결제 금액으로 Top 3 를 지불한 영수증을 출력해주세요. 예를 들어 금요일 손님들의 결제 금액이 각각 $10, $9, $9, $8, $5, $2 였다면 상위 결제 금액 3개는 $10, $9, $8입니다. 따라서 결제 금액이 $10, $9, $9, $8인 총 4개의 영수증을 각각 출력해야 합니다. day ,time, sex, total_bill 칼럼 출력하기.
✔️ LEVEL 4
📌 주요 요구사항
- 요일별(day 기준)로 total_bill 순위를 매겨야 함.
- 동순위 고려해야 하므로 DENSE_RANK() 사용.
- 순위가 1, 2, 3위인 행만 출력.
WITH bill_RANK AS (
SELECT day,time,sex, total_bill,
DENSE_RANK() OVER (PARTITION BY DAY ORDER BY TOTAL_BILL DESC) R
FROM TIPS
)
SELECT day,time,sex, total_bill
FROM bill_RANK
WHERE R <= 3;
✍ 코드 해석
- DENSE_RANK() + PARTITION BY
- 요일(day)별로 그룹화하고, 결제 금액(total_bill) 기준 내림차순 정렬.
- 같은 금액이면 같은 순위 부여.
- WITH 절 (bill_RANK CTE)
- 요일별 결제 금액 순위 계산해서 컬럼 생성(R).
- WHERE 조건 적용
- 순위(R)가 3위 이하인 데이터만 필터링.
📌 실행 결과
- 요일별로 결제 금액 높은 상위 3개만 출력됨.
동순위(DENSE_RANK()) 적용되어 같은 금액이면 같은 순위 유지.
✔️ 정리
- DENSE_RANK()로 요일별 total_bill 순위 계산
- 상위 3개만 WHERE r <= 3으로 필터링
- 동순위 처리 주의 (RANK() 쓰면 건너뛸 수 있음)
'학습 > SQL' 카테고리의 다른 글
[solvesql] SQL 풀어보기 - 폐쇄할 따릉이 정류소 찾기 2 (0) | 2025.03.10 |
---|---|
[SQL] TEMP TABLE vs 일반 테이블 vs WITH(CTE) vs VIEW 비교 정리 (0) | 2025.03.09 |
[solvesql] SQL 풀어보기 - 가구 판매의 비중이 높았던 날 찾기 (0) | 2025.03.08 |
[프로그래머스]SQL 학습 - 상품을 구매한 회원 비율 구하기 (0) | 2025.03.07 |
[solvesql] SQL 풀어보기 - 배송 예정일 예측 성공과 실패 (0) | 2025.03.06 |