Contents
내가 작성한 쿼리
처음에는 모든 제품의 가격이 10입니다.
2019-08-16일에 모든 제품의 가격을 찾기 위한 해결책을 작성하세요.
결과 테이블을 순서에 상관없이 반환하세요.
내가 작성한 쿼리
MySQL
-- 8월 16일 이전것들 추출하는 CTE
WITH price_history AS (
SELECT *
FROM Products
WHERE change_date <= '2019-08-16'
),
-- 각 id별 가장 마지막으로 변경된 날 추출하는 CTE
latest_price AS (
SELECT
product_id,
MAX(change_date) AS latest_date
FROM price_history
GROUP BY product_id
)
SELECT
p.product_id,
IFNULL(ph.new_price, 10) AS price
FROM (
SELECT DISTINCT product_id FROM Products
) p
LEFT JOIN latest_price lp -- id 기준으로 JOIN
ON p.product_id = lp.product_id
LEFT JOIN price_history ph -- id, 날짜 기준으로 JOIN
ON p.product_id = ph.product_id
AND lp.latest_date = ph.change_date
ORDER BY p.product_id;
Oracle
-- 8월 16일 이전것들 추출하는 CTE
WITH price_history AS (
SELECT *
FROM Products
WHERE change_date <= TO_DATE('2019-08-16', 'YYYY-MM-DD')
),
-- 각 id별 가장 마지막으로 변경된 날 추출하는 CTE
latest_price AS (
SELECT
product_id,
MAX(change_date) AS latest_date
FROM price_history
GROUP BY product_id
)
SELECT
p.product_id,
NVL(ph.new_price, 10) AS price
FROM (
SELECT DISTINCT product_id FROM Products
) p
LEFT JOIN latest_price lp -- id 기준으로 JOIN
ON p.product_id = lp.product_id
LEFT JOIN price_history ph -- id, 날짜 기준으로 JOIN
ON p.product_id = ph.product_id
AND lp.latest_date = ph.change_date
ORDER BY p.product_id;
차이점
항목 | MySQL | Oracle |
날짜 표시 방식 차이 | '2019-08-16' | TO_DATE('2019-08-16', 'YYYY-MM-DD') |
NULL 대체 함수 | IFNULL(a, b) | NVL(a, b) |
Share article