题目
产品数据表: Products
Column Name | Type |
---|---|
product_id | int |
new_price | int |
change_date | date |
这张表的主键是 (product_id, change_date)。 这张表的每一行分别记录了 某产品 在某个日期 更改后 的新价格。
写一段 SQL来查找在 2019-08-16 时全部产品的价格,假设所有产品在修改前的价格都是 10 。
以 任意顺序 返回结果表。
查询结果格式如下例所示。
示例 1:
输入: Products 表:
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 |
输出:
product_id | price |
---|---|
2 | 50 |
1 | 35 |
3 | 10 |
题解
sql
SELECT `t`.`product_id`,
-- 若产品2019-08-16未更新价格 则为固定价格10
IFNULL(`p`.`new_price`, 10) AS `price`
-- 通过子查询按照product_id分组 找到日期在2019-08-16或之前的最大日期 没有则为NULl
FROM (SELECT `product_id`, MAX(IF(`change_date` > '2019-08-16', NULL, `change_date`)) AS `max_date`
FROM `Products`
GROUP BY `product_id`) `t`
-- 再跟产品关联 找到当时的最新价格
LEFT JOIN `Products` `p` ON `t`.`product_id` = `p`.`product_id` AND `p`.`change_date` = `t`.`max_date`
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9