产品价格变动带来的结算金额处理逻辑 lead/lag函数的使用

背景:

计算公式:结算金额 = 产品单价(数值随时会变动) * 产品点击数

产品价格随时会更改,例如上午00:00:00点--->13:59:59 是单价 3元,下午 14:00:00-23:59:59 就改为4元。那么今天的结算金额 = 

[00:00:00点:13:59:59]的点击数 * 3元 + [14:00:00-23:59:59]的点击数 * 4元

.sql(hive): 计算时间区间的产品价格表b

 select
    product_code,                                  -- 产品编码
    split(product_name, '#')[0] as product_name,   -- 产品名称
    product_type, -- 产品类型
    update_time,  -- 价格更新的时间
    price,        -- 价格
    lag(update_time, 1, '0000-00-00 00:00:00') over(partition by product_name, product_code order by update_time) last_time, -- 按产品分组,上一次更新时间
    lag(price, 1, 0) over(partition by product_name, product_code order by update_time) last_price, -- 按产品分组,上一次更新时的价格
    lead(update_time, 1, '9999-99-99 99:99:99') over(partition by product_name, product_code order by update_time) next_time, -- 按产品分组,下一次更新时间
    lead(price, 1, 0) over(partition by product_name, product_code order by update_time) next_price -- 按产品分组,下一次更新时的价格
from ods.ods_product_price_minutes -- 该表中的价格已去重,即每天的分区中同产品同价格的数据仅有一条
-- 需拿到近两天的价格,因若点击时间为今日最早的update价格时间之前,则需要取用前一天最后的价格来计算
where d >= date_format(date_sub('${d_minutes}', 10), 'yyyy-MM-dd')
and product_code = 'yiqihuabjzz'

结果 :【源数据有问题,可以不看下图.弄懂思路就好】

.

   得到每个用户的点击时间明细表a

字段:1.产品编码 2.产品名称 3.用户手机号 4.点击时间(精确到时分秒)

.  表a 和表b 关联.表a是左表,表b是右表.

关联条件on:产品名称 产品编码

筛选条件where :

1.表a的点击时间 > 表b的last_time

2.表a的点击时间 < 表b的next_time

3.表a的点击时间 > 表b的update_time (也就是点击时间要大于价格的更改时间)

.根据产品编码/产品名称等维度group by 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值