例:測試數據如下表(user_login_table)
注:對於工作日(上周五和下周一也界定為連續),則方法二適用
實現思路一:
1、使用開窗函數row_number() 對每個user_id 的登陸日期進行排序,得到排名rn
2、然后用login_date減去排名rn,得到一個新的日期new_date字段,比如,‘2021-10-01’減去1得到‘2021-09-30’,‘2021-10-02’減去2得到‘2021-09-30’......,減完之后得到的日期相同,則說明登陸日期連續
3、之后按user_id和new_date,進行計數,得到login_days
4、最后按user_id分組,取每個user_id對應login_days的最大值,即為該user_id的最大登陸天數max_login_days
SQL:
select user_id,max(login_days) max_login_days
from (select user_id,new_date,count(*) login_days
from (select user_id,
login_date,
row_number() over(partition by user_id order by login_date) rn,
login_date - row_number() over(partition by user_id order by login_date) new_date
from user_login_table)a
group by user_id, new_date)b
group by user_id;
實現思路二:
1、自己創建一個日期表(包含分析期間的所有日期),表名(dic_date_table)
2、使用開窗函數row_number() 對每個user_id 的登陸日期進行排序,得到排名rn
3、使用開窗函數row_number()對日期表中的日期(dic_date)進行排序,得到rn_1
4、將步驟2和3得到的結果,通過日期字段關聯,然后用rn_1 - rn得到 num
5、之后按user_id和num,進行計數,得到login_days
6、最后按user_id分組,取每個user_id對應login_days的最大值,即為該user_id的最大登陸天數max_login_days
將上面兩表關聯(login_date = dic_date)得到以下結果:
SQL:
select T.user_id, max(login_days) max_login_days
from (select t.user_id, t.num, count(*) login_days
from (select a.user_id, b.rn_1 - a.rn num
from (select user_id,
login_date,
row_number() over(partition by user_id order by login_date) rn
from user_login_table)a
left join (select dic_date,
row_number() over(order by dic_date) rn_1
from dic_date_table)b
on a.login_date = b.dic_date)t
group by t.user_id, t.num)T
group by T.user_id;