문제 링크
https://leetcode.com/problems/product-price-at-a-given-date/editorial/
문제 설명
Table: Products
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| product_id | int |
| new_price | int |
| change_date | date |
+---------------+---------+
(product_id, change_date) is the primary key (combination of columns with unique values) of this table.
Each row of this table indicates that the price of some product was changed to a new price at some date.
Write a solution to find the prices of all products on 2019-08-16. Assume the price of all products before any change is 10.
Return the result table in any order.
The result format is in the following example.
Example 1:
Input:
Products table:
+------------+-----------+-------------+
| product_id | new_price | change_date |
+------------+-----------+-------------+
| 1 | 20 | 2019-08-14 |
| 2 | 50 | 2019-08-14 |
| 1 | 30 | 2019-08-15 |
| 1 | 35 | 2019-08-16 |
| 2 | 65 | 2019-08-17 |
| 3 | 20 | 2019-08-18 |
+------------+-----------+-------------+
Output:
+------------+-------+
| product_id | price |
+------------+-------+
| 2 | 50 |
| 1 | 35 |
| 3 | 10 |
+------------+-------+
내 풀이
WITH a AS (
SELECT product_id, 10 as price
FROM Products
GROUP BY product_id
), b AS(
SELECT product_id, MAX(change_date) max_date
FROM Products
WHERE change_date <= 20190816
GROUP BY product_id
), c AS(
SELECT p.product_id, new_price AS price
FROM Products p, b
WHERE p.product_id = b.product_id AND p.change_date = b.max_date
)
SELECT a.product_id, COALESCE(c.price, a.price) as price
FROM a LEFT JOIN c
ON c.product_id = a.product_id
Editorial solution
Divide cases by using UNION ALL
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
)
Divide cases by using LEFT JOIN
SELECT
UniqueProductId.product_id,
IFNULL (LastChangedPrice.new_price, 10) AS price
FROM
(
SELECT DISTINCT
product_id
FROM
Products
) AS UniqueProductIds
LEFT JOIN (
SELECT
Products.product_id,
new_price
FROM
Products
JOIN (
SELECT
product_id,
MAX(change_date) AS change_date
FROM
Products
WHERE
change_date <= "2019-08-16"
GROUP BY
product_id
) AS LastChangedDate USING (product_id, change_date)
GROUP BY
product_id
) AS LastChangedPrice USING (product_id)