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을 반환하도록 수정하면 완료!
'코딩일기' 카테고리의 다른 글
SQL 코드카타 111 - Last Person to Fit in the Bus (0) | 2024.07.08 |
---|---|
알고리즘 코드카타 111 - 무인도 여행 (0) | 2024.07.08 |
알고리즘 코드카타 110 - 두 큐 합 같게 만들기 (0) | 2024.07.07 |
알고리즘 코트카타 - 26 ~ 30 (자바스크립트) (0) | 2024.07.06 |
SQL 코드카타 109 - Consecutive Numbers (0) | 2024.07.06 |