【LC中等】1164. 指定日期的产品价格代码优化

❤️博客主页: 楚生辉
❤️系列专栏:【LeetCode刷题】
❤️一句短话: 坚持不懈,孜孜不倦

1.题目描述

产品数据表: Products

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

写一段 SQL来查找在 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 | price |
+------------+-------+
| 2          | 50    |
| 1          | 35    |
| 3          | 10    |
+------------+-------+

2.代码实现

思路实现:先筛选出change_date在2019-08-16之前最大的new_price以及id,在用它与Products进行连接筛选,然后再以把所有的id查询出来进行表与表之间的左连接,最后进行null值处理。

SELECT
	t1.product_id AS product_id,
IF( new_price IS NULL, 10, new_price ) AS price 
FROM
	( SELECT DISTINCT product_id FROM Products ) t1
	LEFT JOIN (
	SELECT
		t1.product_id AS product_id,
		t1.new_price 
	FROM
		Products t1
		JOIN ( SELECT product_id, max( change_date ) AS DATA FROM Products WHERE change_date <= '2019-08-16' GROUP BY product_id ) t2 ON t1.product_id = t2.product_id 
		AND t1.change_date = t2.DATA 
	) t2 ON t1.product_id = t2.product_id

减少一层连接,通过多列in去优化join连接,每少一层连接,就会极大的增加效率

SELECT DISTINCT
	a.product_id,
	ifnull( b.new_price, 10 ) AS price 
FROM
	Products a
	LEFT JOIN (
	SELECT
		product_id,new_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 )) b 
ON a.product_id = b.product_id 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楚生辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值