본문 바로가기

코딩일기

SQL 코드카타 110 - Product Price at a Given Date

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을 반환하도록 수정하면 완료!

아무튼 성공!