详解力扣高频SQL50题之1084. 销售分析 III【简单】

传送门:1084. 销售分析 III

题目

表: Product

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

| Column Name | Type |

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

| product_id | int |

| product_name | varchar |

| unit_price | int |

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

product_id 是该表的主键(具有唯一值的列)。

该表的每一行显示每个产品的名称和价格。

表:Sales

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

| Column Name | Type |

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

| seller_id | int |

| product_id | int |

| buyer_id | int |

| sale_date | date |

| quantity | int |

| price | int |

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

这个表可能有重复的行。

product_id 是 Product 表的外键(reference 列)。

该表的每一行包含关于一个销售的一些信息。

编写解决方案,报告 2019年春季 才售出的产品。即 仅 在 2019-01-01 (含)至 2019-03-31 (含)之间出售的商品。

以 任意顺序 返回结果表。

结果格式如下所示。

示例 1:

输入:

Product table:

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

| product_id | product_name | unit_price |

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

| 1 | S8 | 1000 |

| 2 | G4 | 800 |

| 3 | iPhone | 1400 |

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

Sales table:

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

| seller_id | product_id | buyer_id | sale_date | quantity | price |

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

| 1 | 1 | 1 | 2019-01-21 | 2 | 2000 |

| 1 | 2 | 2 | 2019-02-17 | 1 | 800 |

| 2 | 2 | 3 | 2019-06-02 | 1 | 800 |

| 3 | 3 | 4 | 2019-05-13 | 2 | 2800 |

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

输出:

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

| product_id | product_name |

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

| 1 | S8 |

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

解释:

id 为 1 的产品仅在 2019 年春季销售。

id 为 2 的产品在 2019 年春季销售,但也在 2019 年春季之后销售。

id 为 3 的产品在 2019 年春季之后销售。

我们只返回 id 为 1 的产品,因为它是 2019 年春季才销售的产品。

解析

这题有坑点,不仔细的人是通不过的。首先,题目求的是售出的产品,所以如果产品id不在销售表中就无需展示,所以需要用内连接而不是左连接。连接完后按产品id分组,由于题目返回的是产品id和名称,所以Oracle中需要同时对产品id和名称分组。坑点来了,题目要求的是筛选仅在2019年春季售出的产品,仅在2019春季指一个产品对应的所有日期都在2019春季。不难想到,若该产品对应的售出日期的最小值不小于2019年春季第一天,最大值不超过2019年春季最后一天,则为仅在2019春季售出的产品。

算法(标准SQL)

内连接产品表和销售表,连接条件为产品表.产品id=销售表.产品id,再对产品id和名称分组,再筛选销售日期都在2019春季的产品,即该产品对应的售出日期的最小值不小于2019-01-01,最大值不大于2019-03-31,最后返回产品id和名字即可。

代码(标准SQL)

sql 复制代码
select p.product_id,p.product_name
from Product p
join Sales s
on p.product_id=s.product_id
group by p.product_id,p.product_name
having min(sale_date)>=date'2019-01-01'
and max(sale_date)<=date'2019-03-31';
相关推荐
悟道书生1 小时前
若依 RBAC 权限控制学习笔记
java·网络·笔记·sql·学习·vue
文丑颜不良啊2 小时前
LeetCode926~950题目解析
java·leetcode
John_Hui4 小时前
MySQL基础知识
数据库·sql·mysql·1024程序员节
泡海椒4 小时前
深度解析JQuick-SQL 逻辑计划到物理计划生成机制|分布式SQL原理
数据库·分布式·sql
alphaTao4 小时前
LeetCode 每日一题 2026/10/19-2026/10/25
算法·leetcode
Rain的Java大神之路5 小时前
面了 50 个候选人,90% 都挂在 LeetCode 3 无重复字符的最长子串:滑动窗口的 5 个致命坑
java·后端·leetcode
文丑颜不良啊16 小时前
LeetCode876~900题目解析
java·leetcode
正在走向自律17 小时前
数据集成产品的技术底座:从日志解析原理到 KFS 同步链路搭建(含建表与增删改查完整代码)
数据库·oracle·信创·数据集成·国产数据库·kingbasees·全量+增量同步
猫咪很可爱20 小时前
Oracle ORA-4031 错误分析与处理:SGA 内存不足导致 update/exp/expdp 失败
数据库·oracle
猫咪很可爱1 天前
MySQL 视图与只读用户:安全查询的完整实践指南
数据库·sql·mysql