HIVE窗口函数按日期累加 (取消费满50的日期,满100的日期)

取每个顾客消费满50、满100时的日期

表如下图:

name costdate num
jack 2015-01-01 10
tony 2015-01-02 15
jack 2015-02-03 23
tony 2015-01-04 29
jack 2015-01-05 46
jack 2015-04-06 42
tony 2015-01-07 50
jack 2015-01-08 55
mart 2015-04-08 62
mart 2015-04-09 68
neil 2015-05-10 12
mart 2015-04-11 75
neil 2015-06-12 80
mart 2015-04-13 94

 

1.计算出每天的累加和、以及累积和-50、累加和-100  (设此临时表为qq)

select 
name,
costdate,
--每天消费金额
num,
--累加和
sumnum,
sumnum-50 as num_50,
sumnum-100 as num_100
from
(
select name,costdate,num,sum(num) over(partition by name order by costdate) as sumnum
from aa
)aaa 

HIVE窗口函数按日期累加 (取消费满50的日期,满100的日期)_第1张图片

2.分别对 累加和-50  和  累加和-100  的差值筛选(大于等于0)并且按name分组排序 取排序后为第一的值

再用 累加和-50  排序后为第一的值  左连接  累加和-100  排序后为第一的值  (qq为步骤1的临时表)

select
mm.name,
--消费到50的日期
mm.costdate as costdate_50,
--减50
num_50,
--排序
num50,
--消费到50的金额
mm.sumnum as sumnum_50,
--消费到100的日期
nn.costdate as costdate_100,
--减100
num_100, 
--排序
num100,
--消费到100的金额
nn.sumnum as sumnum_100
from
(
select name,costdate,num,sumnum,num_50, num50
from
(select name,costdate,num,sumnum,num_50,row_number() over(partition by name order by num_50) as num50
from qq
where num_50>=0
)m
where  num50=1
)mm

left join 

(
select
name,costdate,num,sumnum,num_100, num100
from
(select name,costdate,num,sumnum,num_100,row_number() over(partition by name order by num_100) as num100
from qq
where num_100>=0
)n
where n.num100=1
)nn on mm.name=nn.name

 

mm.name costdate_50 num_50 num50 sumnum_50 costdate_100 num_100 num100 sumnum_100
jack 2015-01-05 6 1 56 2015-01-08 11 1 111
mart 2015-04-08 12 1 62 2015-04-09 30 1 130
neil 2015-06-12 42 1 92 NULL NULL NULL NULL
tony 2015-01-07 44 1 94 NULL NULL NULL NULL

 

 

你可能感兴趣的:(HIVE,数据库,mysql)