【力扣白嫖日记】1164.指定日期的产品价格

前言

练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。

今日题目:

1164.指定日期的铲平价格
表:Products

列名类型
product_idint
new_priceint
change_datedate

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

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

以 任意顺序 返回结果表。


我那不值一提的想法:

  • 首先梳理表内容,题干一共给了一张产品数据表,记录了产品id,产品更新后的的价格,产品更新日期。

  • 其次分析需求, 需要找出在2019-08-16时全部产品的价格

  • 那么现在就有以下两种情况,

  • 1.最大日期是小于或等于2019-08-16之前的一个日期的价格,那么价格就是16号的价格,或者是16号之前最近日期的一个价格

  • 2.最小日期都是大于2019-08-16的,那么价格就是10

  • 第二个需求我们很好解决,直接就是min(change_date) > "2019-08-16"

  • 难的是第一个需求,如何求得离16号最近的日期,在这里我通过datediff来计算,通过计算每个日期距离16号的距离,然后对距离进行降序排序,然后再提取排名第一的日期,就能得到距离16号最近的日期

  • 但是这里我们还需要求每个产品的日期距离16号最近的日期,所以还需要分组求日期,在这里就会用到partition by ,对产品id进行分组。

  • 最后再通过union将两个结果连接起来就能得到最终的结果

select product_id,new_price as price
from (
    select *,rank() over (partition by product_id order by datediff(change_date,"2019-08-16") desc) as num
    from Products
    where change_date <= "2019-08-16"
    ) as a 
where a.num = 1
union
select product_id,10 as price
from Products
group by product_id
having min(change_date) > "2019-08-16"


结果:

在这里插入图片描述


总结:

能运行就行。


  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值