[코딩테스트]/[Pandas]

[LeetCode - Pandas] (Easy) 1084.Sales Analysis III

잰잰' 2025. 4. 22. 14:10

 

Table: Product

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| product_id   | int     |
| product_name | varchar |
| unit_price   | int     |
+--------------+---------+

product_id는 이 테이블의 기본 키(고유 값이 있는 열)입니다.
이 테이블의 각 행은 각 제품의 이름과 가격을 나타냅니다.

Table: Sales

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| seller_id   | int     |
| product_id  | int     |
| buyer_id    | int     |
| sale_date   | date    |
| quantity    | int     |
| price       | int     |
+-------------+---------+

이 테이블에는 중복된 행이 있을 수 있습니다.
product_id는 Product 테이블에 대한 외래 키(참조 열)입니다.
이 테이블의 각 행은 하나의 판매에 대한 정보를 포함합니다.

 

문제

2019년 첫 분기(2019-01-01에서 2019-03-31까지)에만 판매된 제품을 보고하는 솔루션을 작성하세요.

결과 테이블은 임의의 순서로 반환하세요.

결과 형식은 다음 예시와 같습니다.

Example 1:

Input: 
Product table:
+------------+--------------+------------+
| product_id | product_name | unit_price |
+------------+--------------+------------+
| 1          | S8           | 1000       |
| 2          | G4           | 800        |
| 3          | iPhone       | 1400       |
+------------+--------------+------------+
Sales table:
+-----------+------------+----------+------------+----------+-------+
| seller_id | product_id | buyer_id | sale_date  | quantity | price |
+-----------+------------+----------+------------+----------+-------+
| 1         | 1          | 1        | 2019-01-21 | 2        | 2000  |
| 1         | 2          | 2        | 2019-02-17 | 1        | 800   |
| 2         | 2          | 3        | 2019-06-02 | 1        | 800   |
| 3         | 3          | 4        | 2019-05-13 | 2        | 2800  |
+-----------+------------+----------+------------+----------+-------+
Output: 
+-------------+--------------+
| product_id  | product_name |
+-------------+--------------+
| 1           | S8           |
+-------------+--------------+

설명 :
제품 ID 1은 2019년 봄에만 판매되었습니다.
제품 ID 2는 2019년 봄에 판매되었지만 그 이후에도 판매되었습니다.
제품 ID 3은 2019년 봄 이후에 판매되었습니다.
우리는 2019년 봄에만 판매된 제품인 제품 1만 반환합니다.

 

✏️ 풀이

import pandas as pd

def sales_analysis(product: pd.DataFrame, sales: pd.DataFrame) -> pd.DataFrame:
    df = sales.groupby('product_id').agg(min=('sale_date', 'min'), max=('sale_date', 'max')).reset_index()
    df = df[(df['min'] >= '2019-01-01') & (df['max'] <= '2019-03-31')]

    result = pd.merge(df, product, how='inner', on='product_id')

    return result[['product_id', 'product_name']]

1. 전체 판매 내역에서 '2019-01-01' ~ 2019-03-31' 사이에 판매 된 물건들에 한해서만 데이터를 조회해야함

2. 각 상품별로 판매 내역 날짜의 min, max를 구함

3. min >= '2019-01-01' & max <= '2019-03-31' 조건에 맞는 데이터 필터

4. product 테이블과 조인하여 필요 데이터 조회