详解力扣高频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;
相关推荐
破碎的南瓜2 小时前
sqli--sql注入过关笔记(1,2,3,4,5,9)
数据库·笔记·sql
Csvn3 小时前
📊 SQL 入门 Day 10:递归 CTE — 破解无限层级查询的终极武器
后端·sql
Database_Cool_5 小时前
企业级多模态分析计算引擎选型:首选 AnalyticDB MySQL 向量 + SQL + 实时一体化方案
数据库·sql·mysql
宇宙第一小趴菜7 小时前
五、Oracle vs MySQL 架构深度对比笔记
mysql·oracle·架构
洵有兮8 小时前
sql注入通关笔记
数据库·笔记·sql·sql注入
闪电悠米8 小时前
力扣hot100-73.矩阵置零-标记数组详解
算法·leetcode·矩阵
sbjdhjd8 小时前
SQL 注入零基础详解:原理、手工注入流程与 Sqli-Labs 靶场实战1~5关和第9关思路
数据库·sql·计算机网络·web安全·网络安全·网络攻击模型·安全架构
雾沉川10 小时前
DataGrip 非商业免费授权说明与完整使用实操教程
sql·idea
慾玄10 小时前
sql注入靶场1-5,9关
数据库·sql
最后的最后、79611 小时前
SQLi-Labs 六关 SQL 注入过关笔记
数据库·笔记·sql