
id daystr amount 1 2019-02-08 1241.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 1261.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.712、计算连续登陆
根据用户ID分组按日期排序,将日期和分组序号相减得到连续登陆的开始日期(from_day),如果开始日期相同说明连续登陆
-- 日期减去分区排序的序号,如果新日期相等,则连续登陆
select
id
, daystr
, amount
, date_sub(daystr, row_number() over(partition by id order by daystr)) from_day
from
table_a;
OK
id daystr amount from_day
1 2019-02-08 1241.55 2019-02-07
1 2019-02-09 1052.99 2019-02-07
1 2019-02-10 85.69 2019-02-07
1 2019-02-12 769.85 2019-02-08
1 2019-02-13 943.86 2019-02-08
1 2019-02-14 538.42 2019-02-08
1 2019-02-15 369.76 2019-02-08
1 2019-02-16 369.76 2019-02-08
1 2019-02-18 795.15 2019-02-09
1 2019-02-19 715.65 2019-02-09
1 2019-02-21 537.71 2019-02-10
2 2019-02-08 1261.55 2019-02-07
2 2019-02-09 1052.99 2019-02-07
2 2019-02-10 85.69 2019-02-07
2 2019-02-12 769.85 2019-02-08
2 2019-02-13 943.86 2019-02-08
2 2019-02-14 943.18 2019-02-08
2 2019-02-15 369.76 2019-02-08
2 2019-02-18 795.15 2019-02-10
2 2019-02-19 715.65 2019-02-10
2 2019-02-21 537.71 2019-02-11
--观察用户连续登陆的情况
select
id
,from_day
,min(daystr) start_date, -- 连续登陆的开始时间
,max(daystr) end_date, -- 连续登陆的结束时间
,count(1) continuous_day, -- 连续登陆的天数
from (
select
id
, daystr
, amount
, date_sub(daystr, row_number() over(partition by id order by daystr)) from_day
from
table_a;
) group by id,from_day