HiveSQL 面试题 - 查询指定日期的全部商品价格

1 需求

查询所有商品(sku_info表)截至到2021年10月01号的最新商品价格(需要结合价格修改表进行分析)。

  • 需要用到的表

商品信息表:sku_info

sku_id(商品id)name(商品名称)category_id(分类id)from_date(上架日期)price(商品价格)
1xiaomi 1012020-01-012000
6洗碗机22020-02-012000
9自行车32020-01-011000

商品价格变更明细表:sku_price_modify_detail

sku_id(商品id)new_price(本次变更之后的价格)change_date(变更日期)
11900.002021-09-25
12000.002021-09-26
280.002021-09-29
210.002021-09-30
  • 期望结果
sku_id (商品id)price <decimal(16,2)> (商品价格)
12000.00
210.00
35000.00
46000.00
5500.00
62000.00
7100.00
8600.00
91000.00
1090.00
1166.00
1220.00

2 实现

  • 思路

结合商品价格表,Join 之后可以得到每个商品在每一个时间点的价格信息,有了这份中间数据,就可以利用开窗函数(row_number / rank,last_value 等)获取到最新的日期。

  • 实现

1 关联商品信息表和价格表获取中间数据

select sku_info.sku_id, change_date, nvl(new_price, price) new_price from sku_info
left join (select * from sku_price_modify_detail where change_date <= '2021-10-01') pc
           on sku_info.sku_id = pc.sku_id
sku_idchange_datenew_price
12021-09-251900.0
12021-09-262000.0
22021-09-2980.0
22021-09-3010.0
32021-09-254999.0
32021-09-265000.0
42021-09-265600.0
42021-09-276000.0
52021-09-27490.0
52021-09-28500.0
62021-09-301988.0
62021-10-012000.0
72021-09-2888.0
72021-09-29100.0
82021-09-28800.0
82021-09-29600.0
92021-09-271100.0
92021-09-281000.0
102021-10-0190.0
112021-10-0166.0
122021-09-2835.0
122021-09-2920.0

2 使用开窗函数查找到最新的日期

select distinct sku_id,
                last_value(new_price) over (partition by sku_id order by change_date asc rows between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING) price
from 
(
	select sku_info.sku_id, change_date, nvl(new_price, price) new_price from sku_info
	left join (select * from sku_price_modify_detail where change_date <= '2021-10-01') pc
           on sku_info.sku_id = pc.sku_id
) t1
sku_idprice
12000.0
1090.0
1166.0
1220.0
210.0
35000.0
46000.0
5500.0
62000.0
7100.0
8600.0
91000.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值