详解力扣高频SQL50题之1164. 指定日期的产品价格【中等】

传送门:1164. 指定日期的产品价格

题目

产品数据表: Products

±--------------±--------+

| Column Name | Type |

±--------------±--------+

| product_id | int |

| new_price | int |

| change_date | date |

±--------------±--------+

(product_id, change_date) 是此表的主键(具有唯一值的列组合)。

这张表的每一行分别记录了 某产品 在某个日期 更改后 的新价格。

一开始,所有产品价格都为 10。

编写一个解决方案,找出在 2019-08-16 所有产品的价格。

以 任意顺序 返回结果表。

结果格式如下例所示。

示例 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 |

±-----------±------+

解析

这题最容易想到的是用UNION,不用UNION会很难做。首先通过观察表格不难看出当最小日期大于8.16时,价格肯定是10,所以第一个子查询就是查询产品表,对产品id分组,筛选最小日期大于2019.8.16的记录,返回产品id和价格,其中价格字段为10,别名price。其次,当最小日期小于等于8.16时,最大日期对应的价格即所求,所以第二个子查询需要用嵌套子查询,具体来说,先查询产品表,过滤出日期<=2019.8.16的记录,再对产品id分组求最大日期,返回产品id和最大日期,作为一张表,再查询该表,但这里需要使用类似"(产品id,日期)in子查询"的语法,Oracle不支持,由于本人用的是Oracle,这里将该表和产品表做关联,连接条件为两表产品id相等,产品表日期=子查询返回的最大日期,然后返回产品id和价格,最后用union连接两表即可。注意字符串转日期不同数据库实现不同,由于本人用的Oracle,故使用Oracle的方式,即"date日期字符串"。

代码(Oracle)

sql 复制代码
select product_id,10 as price
from Products
group by product_id
having min(change_date)>date'2019-08-16'
union
select p.product_id,p.new_price as price
from Products p
join(select product_id,max(change_date)as max_date
from Products
where change_date<=date'2019-08-16'
group by product_id)t
on p.product_id=t.product_id and p.change_date=t.max_date;
相关推荐
To_OC5 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC5 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
唐青枫5 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
To_OC6 天前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
To_OC6 天前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC7 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
掉头发的王富贵7 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
To_OC9 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
ClouGence9 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
To_OC10 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode