07/01 SQL 문제풀이 - (⭐⭐⭐) 2324. Product Sales Analysis IV (Leetcode)

Data Architect / Engineer·2024년 7월 1일
1

1일_1SQL

목록 보기
61/63
post-thumbnail

문제

  • LeetCode SQL 문제
  • 2324. Product Sales Analysis IV / Medium
  • 문제 내용 : [링크]


내가 작성한 Query

WITH temp_01 as(
    SELECT s.user_id
        , s.product_id
        , SUM(s.quantity * p.price) as sum_total
    FROM Sales s
        JOIN Product p on s.product_id = p.product_id
    GROUP BY user_id, product_id
),
temp_02 as(SELECT user_id
            , MAX(sum_total)as max_total
            FROM temp_01
            GROUP BY user_id
)
SELECT user_id
    , product_id
FROM temp_01
WHERE (user_id, sum_total) IN (SELECT * FROM temp_02)
  • Sales 테이블과 Product 테이블을 product_id 기준으로JOIN하여 user_id, product_id 별로 총 제품 구매금액(SUM(quantity * price) as sum_total)을 구하고 이를 temp_01 임시 테이블로 만든다.

  • 위에서 구한 temp_01 테이블을 다시 한 번GROUP BY 하여 각 유저별 제품 구매액이 가장 큰 제품의 product_id를 구한다. 이를 temp_02 임시 테이블로 만든다.

  • 최종적으로 문제에서 원하는 데이터 (유저별 가장 구매액이 큰 제품의 product_id)를 구한다. WHERE 조건에(user_id, sum_totaltemp_02 테이블에 있는 경우만 구하는 조건을 구현한다.)


⭐⭐⭐

  • 이전 문제랑 유사하게, 원본 테이블에서 집계 테이블을 구하고, 집계 테이블에서 최대/최소를 가지는 데이터로 전처리하고 이 테이블에 있는 데이터만 구하는 방식으로 문제를 해결했다.

  • 추가로 temp_01 테이블에서 Window Function을 활용해 쿼리를 작성하는 방법도 있다.


내가 작성한 Query (Window Function 사용)

WITH temp_01 as(
    SELECT s.user_id
        , s.product_id
        , SUM(s.quantity * p.price) as sum_total
        , RANK() over(partition by user_id order by SUM(s.quantity * p.price) desc) as rnum
    FROM Sales s
        JOIN Product p on s.product_id = p.product_id
    GROUP BY user_id, product_id
)
SELECT user_id
    , product_id
FROM temp_01
WHERE rnum = 1
  • RANK함수와 Window Function을 통해 user_idpartition을 설정하고, SUM(quantity * price) 값이 큰 순서대로 내림차순으로 순위를 나타내는 rnum 컬럼을 만든다.

  • 이후 rnum 값이 1인 데이터(즉, 총 구매 금액이 큰 제품의 product_id)만 WHERE절에 조건을 주어 출력한다.

profile
질문은 계속돼 아오에

0개의 댓글