hive sql练习4(不典型):窗口函数的使用

题目

在这里插入图片描述
注意: 每个订单号中,按发货人排序,退货数量挨个分发给发货人,直至退完为止。

代码实现

with send_order as(
select '1' as s_order_id, 'A' as sender, 1 as send_count union all 
select '1' as s_order_id, 'B' as sender, 4 as send_count union all 
select '2' as s_order_id, 'A' as sender, 2 as send_count union all 
select '2' as s_order_id, 'B' as sender, 1 as send_count union all 
select '2' as s_order_id, 'C' as sender, 3 as send_count 
)
, return_order as(
select '1' as r_order_id, 2 as return_count union all 
select '2' as r_order_id, 3 as return_count 
)
,tmp as(
select 
s.*
,r.*
--发货数量做一个累加
,sum(s.send_count) over(partition by s.s_order_id order by s.sender) as acc_sum
from send_order s 
join return_order r 
on s.s_order_id = r.r_order_id
)
,tmp2 as(
select 
t.*
--上一个发货数量的累加值
,lag(acc_sum) over(partition by s_order_id order by sender) as lag_acc_sum
from tmp t
)
,tmp3 as(
select 
t.*
,case when acc_sum < return_count then send_count
      when lag_acc_sum < return_count and acc_sum = return_count then send_count
      when lag_acc_sum < return_count and acc_sum > return_count then return_count - lag_acc_sum
      else 0
 end as sender_return_count
from tmp2 t
)
select 
s_order_id as order_id
,sender
,sender_return_count
from tmp3 t
where sender_return_count <> 0
;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值