LeetCode 586을 푸는 방법

발행: (2026년 1월 15일 오후 12:25 GMT+9)
2 min read
원문: Dev.to

Source: Dev.to

문제 개요

고객 번호 중에서 가장 많은 주문을 한 고객을 찾는 것이 과제입니다. Orders 테이블에는 두 개의 식별자 컬럼, order_numbercustomer_number가 있습니다. 테스트 케이스에서는 가장 많은 주문을 한 고객이 정확히 한 명 존재한다는 것이 보장되지만, 후속 질문에서는 동점이 발생했을 때 어떻게 처리할지를 묻습니다.

해결 방법

  1. 고객별 주문 집계GROUP BY customer_number와 함께 COUNT()를 사용해 각 고객의 주문 수를 계산합니다.
  2. 집계 결과에 순위 부여RANK() 윈도우 함수를 사용해 주문 수를 내림차순으로 정렬합니다. 이렇게 하면 가장 높은 주문 수를 가진 고객에게 1위가 부여되고, 동점인 경우에도 모두 1위가 됩니다.
  3. 최고 순위 고객 선택 – 순위가 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;
Back to Blog

관련 글

더 보기 »

LeetCode 1193 해결 방법

문제 설명 테이블 **Transactions**는 다음과 같은 열을 가지고 있습니다: - id (primary key) - country - state (enumeration: 'approved' 또는 'declined') - amount - trans…

데이터베이스 트랜잭션

트랜잭션은 SQL 데이터베이스가 작동하는 방식의 근본적인 요소입니다. 매일 수조 건의 트랜잭션이 실행되며, SQL에 의존하는 수천 개의 애플리케이션 전반에 걸쳐 이루어집니다.