[ 알고리즘 ] LeetCode 2324. Product Sales Analysis IV

이주 weekwith.me·2022년 7월 1일
0

알고리즘

목록 보기
24/73
post-thumbnail

블로그를 이전 중이라 완료되기 전까지는 벨로그에 작성할 계획입니다.
이후 모든 글은 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;
profile
Be Happy 😆

0개의 댓글