当前位置: 首页 > news >正文

【SQL】指定日期的产品价格

目录

题目

分析

代码


题目

产品数据表: Products

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

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

以 任意顺序 返回结果表。

结果格式如下例所示。

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

分析

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

关键点在找到 2019-08-16 前所有有改动的产品及其最新价格和没有修改过价格的产品

没有提供产品id列表,首先自行整理一份产品id列表,保证每个产品都考虑考虑到

(select distinct product_id from Products) a

需要找到2019-08-16 前所有有改动的产品

即针对一种产品,找到其在2019-08-16 前的最新价格,也就是最新日期的价格

select product_id,max(change_date) from Products

where change_date <= '2019-08-16'

group by product_id

将上述整理为新表b,左连接产品表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

还存在没有修改过价格的产品,所有产品在修改前的价格都是 10 。

通过ifnull,若为null,则价格为10,ifnull(b.new_price,10)

代码

select a.product_id, ifnull(b.new_price,10) price
from (select distinct product_id from Products) a
left join (select product_id,new_price from Productswhere (product_id,change_date) in (select product_id,max(change_date) from Productswhere change_date <= '2019-08-16'group by product_id)
) b
on a.product_id = b.product_id


http://www.mrgr.cn/news/9161.html

相关文章:

  • Linux进程间通信——硬件实现临界区互斥的基本方法
  • 机器学习的入门笔记(第十五周)
  • Git的使用教程及常用语法02
  • C++贪心算法
  • IPC 进程间通信方式
  • 零基础5分钟上手亚马逊云科技-用云原生架构开发代码
  • UE管理内容 —— FBX Morph Target Pipeline
  • 每日一练【最大连续1的个数 III】
  • SQL-DCL-数据控制语言
  • R语言绘图系列专栏 | 更新中
  • CSS counters 属性:打造个性化计数器的秘籍
  • OpenAI 通过强大的结构化输出功能增强了其 API
  • Eureka中的多实例配置:如何处理微服务实例动态扩展与缩减
  • 《AI办公类工具PPT系列之三——Gamma APP》
  • 黑神话悟空|风灵月影 35项修改器下载
  • Java-泛型方法工具类
  • 鸿蒙内核源码分析(异常接管篇) | 社会很单纯,复杂的是人
  • 通过ip获取地址
  • pymysql 与 MySQL数据库交互
  • 资产架构端口应用CDNWAF站库分离负载均衡