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를 적절히 활용하면 좋구만 ~
'SQL > 문제풀이' 카테고리의 다른 글
[LeetCode] last-person-to-fit-in-the-bus 📌 (0) | 2024.03.20 |
---|---|
[LeetCode] count-salary-categories (0) | 2024.03.09 |
[LeetCode] primary-department-for-each-employee (0) | 2024.03.09 |
[LeetCode] immediate-food-delivery-ii (0) | 2024.03.05 |
[LeetCode] average-selling-price 📌 (0) | 2024.03.05 |