블로그를 이전 중이라 완료되기 전까지는 벨로그에 작성할 계획입니다.
이후 모든 글은 https://weekwith.me 에 작성 예정이니 다른 글이 궁금하시다면 해당 링크를 통해 방문해주세요.본 글은 [ LeetCode ] 2324. Product Sales Analysis IV를 풀고 작성한 글입니다.
Table: Sales
+-------------+-------+
| Column Name | Type |
+-------------+-------+
| sale_id | int |
| product_id | int |
| user_id | int |
| quantity | int |
+-------------+-------+
sale_id is the primary key of this table.
product_id is a foreign key to Product table.
Each row of this table shows the ID of the product and the quantity purchased by a user.
Table: Product
+-------------+------+
| Column Name | Type |
+-------------+------+
| product_id | int |
| price | int |
+-------------+------+
product_id is the primary key of this table.
Each row of this table indicates the price of each product.
Write an SQL query that reports for each user the product id on which the user spent the most money. In case the same user spent the most money on two or more products, report all of them.
Return the resulting table in any order.
GROUP
구를 활용하여 user_id
별로 동일한 product_id
에 대해 price
필드와 quantity
필드의 값을 곱한 걸 SUM
함수를 사용해 집계를 내고 이를 기준으로 RANK
윈도우 함수를 통해 내림차순으로 순위를 매긴 다음 그곳에서 값이 1
인 경우만 WHERE
구로 뽑아내면 된다.
접근법을 토대로 풀면 아래와 같다.
SELECT user_id, product_id
FROM (
SELECT
Sales.user_id,
Sales.product_id,
RANK() OVER(PARTITION BY Sales.user_id ORDER BY SUM(Product.price * Sales.quantity) DESC) AS spent_rank
FROM Sales
JOIN Product
USING (product_id)
GROUP BY Sales.user_id, Sales.product_id
) AS SalesRankings
WHERE spent_rank = 1;