최대 1 분 소요

문제 링크

정답

SELECT
    product_id, 10 AS price
FROM Products
GROUP BY product_id
HAVING MIN(change_date) > '2019-08-16'

UNION ALL

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

✅ Point

  • 특정 날짜 (2019-08-16) 를 기준으로 갱신된 가격 가져오기
    • 기준 날짜 이전에 가격이 갱신된 적이 없다면 -> 기본값 10 부여
    • 기준 날짜 이전에 가격이 갱신된 내역이 있다면 -> 가장 최근의 가격 가져오기
  • 기준 날짜 이전에 가격이 갱신된 적이 없는 경우
    • MIN(change_date) 으로 확인
  • 기준 날짜 이후에 가격이 갱신된 적이 있는 경우
    • 갱신 여부
      • change_date <= 2019-08-16 을 만족하면서 MAX(change_date) 로 최신 갱신 날짜 가져오기
      • 해당 조건을 만족하는 (product_id, change_date) 가져와서 JOIN
  • 둘을 union하여 최종 결과 도출