LeetCode mysql 刷题六:指定日期的产品价格——3种方法处理未查询到日期

2023年 9月 26日 13.3k 0

题目

题目链接:指定日期的产品价格

编写一个解决方案,找出在 2019-08-16 时全部产品的价格,假设所有产品在修改前的价格都是 10 。

以 任意顺序 返回结果表。

结果格式如下例所示。

输入:
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, change_date) 是此表的主键(具有唯一值的列组合)。
这张表的每一行分别记录了 某产品 在某个日期 更改后 的新价格。

输出:
+------------+-------+
| product_id | price |
+------------+-------+
| 2          | 50    |
| 1          | 35    |
| 3          | 10    |
+------------+-------+
Create table If Not Exists Products (product_id int, new_price int, change_date date);
Truncate table Products;
insert into Products (product_id, new_price, change_date) values ('1', '20', '2019-08-14');
insert into Products (product_id, new_price, change_date) values ('2', '50', '2019-08-14');
insert into Products (product_id, new_price, change_date) values ('1', '30', '2019-08-15');
insert into Products (product_id, new_price, change_date) values ('1', '35', '2019-08-16');
insert into Products (product_id, new_price, change_date) values ('2', '65', '2019-08-17');
insert into Products (product_id, new_price, change_date) values ('3', '20', '2019-08-18');

解析

这题考察的点是如何查出 product_id3 的数据,因为这个产品在 2019-08-16 之前没有修改过价格

方法一

思路:

查询出在 2019-08-16 之前的最新修改过价格的 product_id

如果修改过价,那么 new_price 是有值的

没有修改过价格,那么 new_pricenull,给它赋值为 10

+------------+-------------+
| product_id | new_price   |
+------------+-------------+
| 1          | 35          |
| 2          | 50          |
| 3          | NULL        |
+------------+-------------+

步骤:

  • 按照 product_id,查询出 2019-08-16 日期之前的最新修改过价格的产品,注意:这里查询不出价格
  • 使用子查询,根据 product_idchange_date 查询出 product_idnew_price,作为临时表 tmp2
  • 查询出所有产品的 product_id,作为临时表 tmp1
    • SELECT product_id FROM Products GROUP BY product_id
    • SELECT DISTINCT product_id FROM Products
  • 左连查询,将 tmp1tmp2 左连,连接条件是 product_id
    • 使用 if 或者 ifnull 判断 new_price 是否为空,如果为空,则使用 10 作为价格
  • SELECT
    product_id, IF(new_price, new_price, 10) price
    FROM (
    SELECT product_id FROM Products GROUP BY product_id
    ) tmp1
    LEFT JOIN (
    SELECT product_id, new_price FROM Products WHERE ( product_id, change_date )
    IN ( SELECT product_id, max(change_date) FROM Products WHERE DATE ( change_date )

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论