
문제
- 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절에 조건을 주어 출력한다.
