leetcode-sql数据库面试题冲刺(高频SQL五十题)

题目:

1164.指定日期的产品价格
产品数据表: Products

±--------------±--------+
| Column Name | Type |
±--------------±--------+
| product_id | int |
| new_price | int |
| change_date | date |
±--------------±--------+
(product_id, change_date) 是此表的主键(具有唯一值的列组合)。
这张表的每一行分别记录了 某产品 在某个日期 更改后 的新价格。

编写一个解决方案,找出在 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 |
±-----------±------+

思路:

a)获取各个货物离2019-08-16日期最近时的价格,该临时表为p5
b)再获取去重id后各个货物的id值,该临时表为p4
c)将p4和p5两个临时表进行左连接,保证连接后的表包含所有货物的id
d)查询p4临时表中的货物id,如果此时p5临时表的价格显示为null的话,说明该货物在2019-08-16前没有更改价格,即为10元计算,使用IFNULL函数设置价格。

代码:

SELECT p4.product_id,IFNULL(p5.new_price,10) AS price
FROM (
    SELECT DISTINCT p3.product_id
    FROM Products AS p3
) AS p4
LEFT JOIN
(SELECT p2.product_id,p2.new_price
FROM Products AS p2
WHERE (p2.product_id,p2.change_date) IN
(SELECT p1.product_id,MAX(p1.change_date)
FROM Products AS p1
WHERE p1.change_date <= '2019-08-16' 
GROUP BY p1.product_id)) AS p5
ON p4.product_id = p5.product_id

你可能感兴趣的:(sql,测试面试,数据库,leetcode,sql)