본문 바로가기

학습/SQL

[solvesql] SQL 풀어보기 - 레스토랑 요일 별 구매금액 Top 3 영수증

✔️ 문제

레스토랑의 매니저는 요일 별로 큰 금액을 결제한 영수증을 찾고 싶습니다. 요일 별 결제 금액으로 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;

✍ 코드 해석

  1. DENSE_RANK() + PARTITION BY
    • 요일(day)별로 그룹화하고, 결제 금액(total_bill) 기준 내림차순 정렬.
    • 같은 금액이면 같은 순위 부여.
  2. WITH 절 (bill_RANK CTE)
    • 요일별 결제 금액 순위 계산해서 컬럼 생성(R).
  3. WHERE 조건 적용
    • 순위(R)가 3위 이하인 데이터만 필터링.

 

 

📌 실행 결과

  • 요일별로 결제 금액 높은 상위 3개만 출력됨.
    동순위(DENSE_RANK()) 적용되어 같은 금액이면 같은 순위 유지.

✔️ 정리

  • DENSE_RANK()로 요일별 total_bill 순위 계산
  • 상위 3개만 WHERE r <= 3으로 필터링
  • 동순위 처리 주의 (RANK() 쓰면 건너뛸 수 있음)