每日一题-24(指定日期的产品价格)

题24:

根据下表写一段SQL来查找在2019-08-16时全部产品的价格,假设所有产品在修改前的价格都是10。
在这里插入图片描述
其中

  • 上表的主键是:product id,change_date;
  • 上表的每一行分别记录了某产品在某个日期更改后的新价格。

解题思路:就是需要找到2019-08-16前所有有改动的产品及其最新价格和没有修改过价格的产品。
(1)找出所有的产品

SELECT DISTINCT product_id
from products

(2)找出产品最新修改的时间:max(),条件是时间要小于等于2019-08-16

select prodyct_id max(change_date)
from products
where change_date <='2019-08-16'
group by product_id

(3)利用where子查询,根据product-id和change_date找到对应的价格

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
)

(4)上面三步已经找到了所有的产品和已经修改过价格的产品。使用left join得到所有产品的最新价格,如果没有设置为10(利用ifnull函数)

select a.product_id, ifnull(b.new_price, 10) as price
from (
    select distinct product_id
    from products
) as 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
    )
) as b 
on a.product_id = b.product_id;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值