Formatted question description: https://leetcode.ca/all/1164.html

1164. Product Price at a Given Date

Level

Medium

Description

Table: Products

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| new_price     | int     |
| change_date   | date    |
+---------------+---------+
(product_id, change_date) is the primary key 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 an SQL query to find the prices of all products on 2019-08-16. Assume the price of all products before any change is 10.

The query result format is in the following example:

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  |
+------------+-----------+-------------+

Result table:
+------------+-------+
| product_id | price |
+------------+-------+
| 2          | 50    |
| 1          | 35    |
| 3          | 10    |
+------------+-------+

Solution

For each product, consider two cases. The first case is that there is at least one entry of the product and the new price that has change date before or on 2019-08-16. The second case is that there is no entry of the product and the new price that has change date before on 2019-08-16.

For the first case, select product_id and new_price as price from table Products where change_date is the maximum value less than or equal to 2019-08-16.

For the second case, select product_id and 10 as price from table Products where product_id is not in the query that change_date <= '2019-08-16.

Finally, join the two sub-queries to obtain the final result.

# Write your MySQL query statement below
select * from (
    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
        )
    union
        select distinct product_id, 10 as price from Products
            where product_id not in (
                select product_id from Products
                    where change_date <= '2019-08-16'
            )
    ) union_result;

All Problems

All Solutions