【SQL】指定日期的产品价格(IFNULL函数)

64 篇文章 1 订阅

题目描述

leetcode题目:指定日期的产品价格
在这里插入图片描述
在这里插入图片描述

思路

  1. 找出所有的产品的指定的日期的价格;
  2. 若找不到某个产品的更改日期,则将该产品价格设置为10。

关键点:

  1. if没有16号的,怎么找到前一个日期的?==> 日期小于16号(条件1)的最大日期(条件2)。
  2. 如果没有对应日期的,则设置为10 ==> IFNULL()函数

细节详见【官方题解】

select distinct A.product_id, IFNULL(B.new_price, 10) as price 
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

记录自己写的错误点

-- select product_id, new_price, max(change_date)
-- from Products
-- where change_date <= '2019-08-16'
-- group by product_id 
-- '''
-- | product_id | new_price | max(change_date) |
-- | ---------- | --------- | ---------------- |
-- | 1          | 20        | 2019-08-16       |
-- | 2          | 50        | 2019-08-14       |
-- '''
-- ERROR: 其中new_price为20 错误,是因为主键是 product_id 和 change_date,而不是主键是product_id;
-- 所以要通过(product_id, change_date) 定位到对应的new_price, 再加一层嵌套。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值