문제
- 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_total
이 temp_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_id
별 partition
을 설정하고, SUM(quantity * price)
값이 큰 순서대로 내림차순으로 순위를 나타내는 rnum
컬럼을 만든다.
이후 rnum
값이 1인 데이터(즉, 총 구매 금액이 큰 제품의 product_id
)만 WHERE
절에 조건을 주어 출력한다.