코딩일기
SQL 코드카타 110 - Product Price at a Given Date
서재일
2024. 7. 7. 16:22
https://leetcode.com/problems/product-price-at-a-given-date/description/
Column Name | Type |
product_id | int |
new_price | int |
change_date | date |
Products 테이블:
- product_id : 제품의 id
- new_price : 변경된 가격
- change_date : 변경된 날짜
2019-08-16의 모든 제품의 가격을 찾는 솔루션을 작성하세요. 모든 제품의 초기 가격은 10이라고 가정하세요.
select
product_id,
max(change_date) change_date
from Products
where change_date <= '2019-08-16'
group by product_id
가장 먼저 2019-08-16의 이전의 값들을 제거해준다. 그리고 값이 여러개라면 가장 최근의 값만 반환한다.
select
P.product_id,
P.new_price
from Products P
left join
(select
product_id,
max(change_date) change_date
from Products
where change_date <= '2019-08-16'
group by product_id) C on P.product_id = C.product_id
원래의 테이블과 결합해서 가장 최근의 가격을 반환한다.
select distinct product_id
from Products
모든 product_id를 중복없이 반환하는 새로운 쿼리를 작성한다.
select *
from
(select
P.product_id,
P.new_price
from Products P
left join
(select
product_id,
max(change_date) change_date
from Products
where change_date <= '2019-08-16'
group by product_id) C on P.product_id = C.product_id
where P.change_date = C.change_date) C
right join
(select distinct product_id
from Products) P on C.product_id = P.product_id
두 쿼리를 결합해서 모든 product_id에 대한 최근 가격을 반환한다. 2019-08-16이전에 가격변동 기록이 없을 경우 null을 반환한다.
select
P.product_id,
COALESCE(C.new_price, 10) price
from
(select
P.product_id,
P.new_price
from Products P
left join
(select
product_id,
max(change_date) change_date
from Products
where change_date <= '2019-08-16'
group by product_id) C on P.product_id = C.product_id
where P.change_date = C.change_date) C
right join
(select distinct product_id
from Products) P on C.product_id = P.product_id
마지막으로 필요한 열만 필터링하고 null값이 10을 반환하도록 수정하면 완료!