其他分享
首页 > 其他分享> > 连续登陆问题案例

连续登陆问题案例

作者:互联网

连续登陆问题案例

在电商、物流和银行可能经常会遇到这样的需求:统计用户连续交易的总额、连续登陆天数、连续登陆开始和结束时间、间隔天数等

数据:

注意:每个用户每天可能会有多条记录

amount表示金额

id	datestr	  amount

1,2019-02-08,6214.23 
1,2019-02-08,6247.32 
1,2019-02-09,85.63 
1,2019-02-09,967.36 
1,2019-02-10,85.69 
1,2019-02-12,769.85 
1,2019-02-13,943.86 
1,2019-02-14,538.42
1,2019-02-15,369.76
1,2019-02-16,369.76
1,2019-02-18,795.15
1,2019-02-19,715.65
1,2019-02-21,537.71
2,2019-02-08,6214.23 
2,2019-02-08,6247.32 
2,2019-02-09,85.63 
2,2019-02-09,967.36 
2,2019-02-10,85.69 
2,2019-02-12,769.85 
2,2019-02-13,943.86 
2,2019-02-14,943.18
2,2019-02-15,369.76
2,2019-02-18,795.15
2,2019-02-19,715.65
2,2019-02-21,537.71
3,2019-02-08,6214.23 
3,2019-02-08,6247.32 
3,2019-02-09,85.63 
3,2019-02-09,967.36 
3,2019-02-10,85.69 
3,2019-02-12,769.85 
3,2019-02-13,943.86 
3,2019-02-14,276.81
3,2019-02-15,369.76
3,2019-02-16,369.76
3,2019-02-18,795.15
3,2019-02-19,715.65
3,2019-02-21,537.71
建表语句
create table deal_tb(
    id string
    ,datestr string
    ,amount string
)row format delimited fields terminated by ',';
计算逻辑
 select  id
         ,datestr
         ,sum(amount) as sum_amount
 from deal_tb
 group by id,datestr;
 
 //执行结果
1	2019-02-08	12461.55
1	2019-02-09	1052.99
1	2019-02-10	85.69
1	2019-02-12	769.85
1	2019-02-13	943.86
1	2019-02-14	538.42
1	2019-02-15	369.76
1	2019-02-16	369.76
1	2019-02-18	795.15
1	2019-02-19	715.65
1	2019-02-21	537.71
2	2019-02-08	12461.55
2	2019-02-09	1052.99
2	2019-02-10	85.69
2	2019-02-12	769.85
2	2019-02-13	943.86
2	2019-02-14	943.18
2	2019-02-15	369.76
2	2019-02-18	795.15
2	2019-02-19	715.65
2	2019-02-21	537.71
3	2019-02-08	12461.55
3	2019-02-09	1052.99
3	2019-02-10	85.69
3	2019-02-12	769.85
3	2019-02-13	943.86
3	2019-02-14	276.81
3	2019-02-15	369.76
3	2019-02-16	369.76
3	2019-02-18	795.15
3	2019-02-19	715.65
3	2019-02-21	537.71
select ttt1.id
       ,ttt1.grp
       ,round(sum(ttt1.sum_amount),2) as sum_amount
       ,count(ttt1.datestr) as days
       ,min(ttt1.datestr) as start_date
       ,max(ttt1.datestr) as end_date
       ,datediff(min(ttt1.datestr),lag(max(ttt1.datestr),1) over (partition by ttt1.id order by ttt1.grp))
from(
    select tt1.id
       ,tt1.datestr
       ,tt1.sum_amount
       ,date_sub(tt1.datestr,rn) as grp
from(
    select t1.id
       ,t1.datestr
       ,t1.sum_amount
       ,row_number() over(partition by id order by datestr) as rn
from  (
     select  id
         ,datestr
         ,sum(amount) as sum_amount
 from deal_tb
 group by id,datestr
) t1
) tt1
) ttt1 group by ttt1.id,ttt1.grp
;
#  id   连续登录日期     连续交易总额           连续登录天数    开始时间         结束时间      间隔天数

    1	2019-02-07	13600.23		3	2019-02-08	2019-02-10	NULL
    1	2019-02-08	2991.65			5	2019-02-12	2019-02-16	2
    1	2019-02-09	1510.8			2	2019-02-18	2019-02-19	2
    1	2019-02-10	537.71			1	2019-02-21	2019-02-21	2
    2	2019-02-07	13600.23		3	2019-02-08	2019-02-10	NULL
    2	2019-02-08	3026.65			4	2019-02-12	2019-02-15	2
    2	2019-02-10	1510.8			2	2019-02-18	2019-02-19	3
    2	2019-02-11	537.71			1	2019-02-21	2019-02-21	2
    3	2019-02-07	13600.23		3	2019-02-08	2019-02-10	NULL
    3	2019-02-08	2730.04			5	2019-02-12	2019-02-16	2
    3	2019-02-09	1510.8			2	2019-02-18	2019-02-19	2
    3	2019-02-10	537.71			1	2019-02-21	2019-02-21	2

标签:02,10,ttt1,08,案例,2019,登陆,datestr,连续
来源: https://www.cnblogs.com/saowei/p/15937652.html