SQL/문제풀이

[LeetCode] product-price-at-a-given-date 📌

응엉잉 2024. 3. 9. 13:23

https://leetcode.com/problems/product-price-at-a-given-date/?envType=study-plan-v2&envId=top-sql-50

 

SELECT product_id,
    new_price AS price
FROM products
WHERE (product_id, change_date) IN (
    SELECT product_id,
        MAX(change_date) as new_date
    FROM products
    WHERE change_date <= '2019-08-16'
    GROUP BY product_id)

UNION

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

ORDER BY product_id

내가 짠 쿼리는 다음과 같다.

 

change_date가 2019-08-16 이전에 존재하는 경우와 2019-08-16 이후에 존재하는 경우에 대해 case를 나눠줄 필요가 있었다.

1) change_date가 16일 이전에 존재하는 경우 16일 이전 일자 중 가장 큰 일자의 가격을 따르고

2) change_date가 16일 이후에 최초인 경우는 가격이 $10으로 고정이다.

 

1. 16일 이전에 change_date가 존재하는 product의 MAX(chanage_date)

SELECT product_id,
	MAX(change_date) as new_date
FROM products
WHERE change_date <= '2019-08-16'
GROUP BY product_id

 

2. 1번 쿼리를 WHERE절 서브쿼리에 이용해 해당 product의 해당 일자의 가격을 뽑았다

SELECT product_id,
    new_price AS price
FROM products
WHERE (product_id, change_date) IN (
    SELECT product_id,
        MAX(change_date) as new_date
    FROM products
    WHERE change_date <= '2019-08-16'
    GROUP BY product_id)

 

3. 16일 이후 chage_date가 존재하는 경우 가격이 10이게끔

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

 

4. 2번과 3번을 UNION, ORDER BY로 정렬

 

Solution에 있는 다른 풀이!

select distinct product_id,
    10 as price 
from Products 
where product_id not in(
    select distinct product_id 
    from Products 
    where change_date <='2019-08-16') -- chanage_date가 16일 이전인 product_id에 해당되지 않는 경우

union 

select product_id,
    new_price as price
from Products 
where (product_id, change_date) in (
    select product_id,
        max(change_date) as date
    from Products 
    where change_date <='2019-08-16'
    group by product_id)

 

DISTINCT를 적절히 활용하면 좋구만 ~