LeetCode 586을 푸는 방법
발행: (2026년 1월 15일 오후 12:25 GMT+9)
2 min read
원문: Dev.to
Source: Dev.to
문제 개요
고객 번호 중에서 가장 많은 주문을 한 고객을 찾는 것이 과제입니다. Orders 테이블에는 두 개의 식별자 컬럼, order_number와 customer_number가 있습니다. 테스트 케이스에서는 가장 많은 주문을 한 고객이 정확히 한 명 존재한다는 것이 보장되지만, 후속 질문에서는 동점이 발생했을 때 어떻게 처리할지를 묻습니다.
해결 방법
- 고객별 주문 집계 –
GROUP BY customer_number와 함께COUNT()를 사용해 각 고객의 주문 수를 계산합니다. - 집계 결과에 순위 부여 –
RANK()윈도우 함수를 사용해 주문 수를 내림차순으로 정렬합니다. 이렇게 하면 가장 높은 주문 수를 가진 고객에게 1위가 부여되고, 동점인 경우에도 모두 1위가 됩니다. - 최고 순위 고객 선택 – 순위가 1인 행만 필터링하여 해당
customer_number를 반환합니다.
공통 테이블 식(CTE)을 사용하면 단계별 로직을 모듈화하고 가독성을 높일 수 있습니다.
SQL 솔루션 (PostgreSQL)
WITH customer_order_count AS (
SELECT customer_number,
COUNT(order_number) AS order_count
FROM Orders
GROUP BY customer_number
),
customer_order_rank AS (
SELECT customer_number,
RANK() OVER (ORDER BY order_count DESC) AS order_rnk
FROM customer_order_count
)
SELECT customer_number
FROM customer_order_rank
WHERE order_rnk = 1;