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

【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 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


http://www.kler.cn/a/280407.html

相关文章:

  • 适合运动佩戴的蓝牙耳机推荐?四款开放式运动耳机推荐
  • Google Earth Engine(GEE)——光谱指数影像的加载(真彩色和假彩色)以及NDVI的计算
  • react面试题十
  • 汽车乘客热舒适度大挑战,如何利用仿真技术提高汽车环境舒适度
  • js跳出循环方法
  • C++实现的活动安排问题
  • GNU/Linux - RSYSLOG
  • 基于粒子群优化算法的六自由度机械臂三维空间避障规划
  • linux和docker部署基本的命令掌握
  • C++语法基础(一)
  • Kubernetes 中如何对 etcd 进行备份和还原
  • 分享一个基于python新闻订阅与分享平台flask新闻发布系统(源码、调试、LW、开题、PPT)
  • Midjourney推出网页版编辑器应对Ideogram 2.0冲击
  • 怎么压缩图片大小?7款实用图片压缩免费软件大公开,赶紧收藏试试!
  • 饿了么后端登录模块
  • “Docker中部署Kibana:步骤与指南“
  • sql-labs36-40通关攻略
  • 3款伪原创工具,为你轻松一键生成原创文案
  • 什么是聚类?简单描述如下的聚类方法:划分方法,层次方法,基于密度的方法,基于模型的方法。为每类方法给出例子。
  • 电商数据爬虫技术深度解析:从入门到实战