홍동이의 성장일기

[LeetCode] 1164. Product Price at a Given Date (조건에 따라 다른 값 부여하기) 본문

Tool/SQL 코딩테스트 풀이

[LeetCode] 1164. Product Price at a Given Date (조건에 따라 다른 값 부여하기)

홍동2 2023. 12. 20. 13:35

 

Product Price at a Given Date - LeetCode

Can you solve this real interview question? Product Price at a Given Date - Table: Products +---------------+---------+ | Column Name | Type | +---------------+---------+ | product_id | int | | new_price | int | | change_date | date | +---------------+----

leetcode.com

 

SELECT product_id
        , 10 AS price
FROM products
GROUP BY product_id
HAVING MIN(change_date) > '2019-08-16'

UNION

SELECT product_id
        , new_price as price
FROM (
    SELECT *
            , ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY change_date DESC) as new_date
    FROM products
    WHERE change_date <= '2019-08-16'
) as t
WHERE new_date = 1

 

💡 문제 풀이

 

이번 문제는 각 product_id가 16일에 어떤 값을 가지고 있는지 알아보는 문제입니다.

세단계로 문제를 해결할 수 있습니다!


 

1단계: 16일과 가장 근접한 날짜의 new_price 찾기

SELECT *
        , ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY change_date DESC) as new_date
FROM products
WHERE change_date <= '2019-08-16'

 

change_date가 2019-08-16 이전이거나 같은 행을 불러옵니다.

product_id 별로 change_date를 내림차순하여 순위를 부여하고 new_date라고 이름 붙였습니다.

 

SELECT product_id
        , new_price as price
FROM (
    SELECT *
            , ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY change_date DESC) as new_date
    FROM products
    WHERE change_date <= '2019-08-16'
) as t
WHERE new_date = 1

 

서브쿼리를 이용하여 new_date가 1인 행만 불러와주면 1단계는 끝입니다.


 

2단계: 16일 이전의 값이 없는 product_id에 10이라는 값주기

SELECT product_id
        , 10 AS price
FROM products
GROUP BY product_id
HAVING MIN(change_date) > '2019-08-16'

 

product_id별로 그룹을 지은 후, change_date의 최솟값이 16일보다 큰 경우에는 10이라는 값을 부여해주었습니다.


3단계: 두 테이블 UNION 해주기

 

1, 2단계에서 만들어준 테이블을 UNION을 사용해서 합쳐주면 문제 해결!

728x90
Comments