数据源
guid01,2018-02-28 guid01,2018-03-01 guid01,2018-03-02 guid01,2018-03-04 guid01,2018-03-05 guid01,2018-03-06 guid01,2018-03-07 guid02,2018-03-01 guid02,2018-03-02 guid02,2018-03-03 guid02,2018-03-06
建表
create table if not exists test.tb_login (uid string, dt string) row format delimited fields terminated by ",";
创建并导入数据
vim /doit/tb_login load data local inpath "/doit/tb_login" into table test.tb_login;
需求:
求连续3天以上登录(不包含3天)的用户以及首次登录日期和最后登录日期,以及登录天数
解法:
第一步: 使用窗口函数,按照用户分组,登录时间排序, 依次打上标号
SELECt uid, dt, ROW_NUMBER() OVER(PARTITION BY uid ORDER BY dt) rn FROM tb_login
第二步: 使用date_sub函数, 将登录时间与标号进行相减
SELECt uid, dt, DATE_SUB(dt,rn) dt_dif FROM (SELECt uid, dt, ROW_NUMBER() OVER(PARTITION BY uid ORDER BY dt) rn FROM tb_login)v1
第三步:
使用groupby对用户和相减后的日期分组, 使用min max函数找出用户所在时间段的首次登录时间和最后登录时间, 使用count统计出登录的次数, 使用having筛选登录次数大于3的数据
SELECt uid, MIN(dt) start_time, MAX(dt) end_time, COUNT(dt) times FROM (SELECt uid, dt, DATE_SUB(dt,rn) dt_dif FROM (SELECt uid, dt, ROW_NUMBER() OVER(PARTITION BY uid ORDER BY dt) rn FROM tb_login) v1) v2 GROUP BY uid,dt_dif HAVINg times > 3



