背景:在網站平臺類業務需求中用戶的「最大登陸天數」,需求比較普遍。
原始數據:
u0001 2019-10-10
u0001 2019-10-11
u0001 2019-10-12
u0001 2019-10-14
u0001 2019-10-15
u0001 2019-10-17
u0001 2019-10-18
u0001 2019-10-19
u0001 2019-10-20
u0002 2019-10-20
說明:數據是簡化版,兩列分別是user_id,log_in_date。現實情況需要從採集數據經過去重,轉換得到以上形式數據
算法:
核心是按訪問時間排序,登陸時間列減去排序後的序列號,得到一個日期值,按這個值分組計數即可。
Step1:排序
select
user_id,
log_in_date,
row_number() over(partitioned by user_id order by log_in_date desc) as rank
from
user_log
結果:
u0001 2019-10-10 1
u0001 2019-10-11 2
u0001 2019-10-12 3
u0001 2019-10-14 4
u0001 2019-10-15 5
u0001 2019-10-17 6
u0001 2019-10-18 7
u0001 2019-10-19 8
u0001 2019-10-20 9
u0002 2019-10-20 1
Step2 :第二列與第三列做日期差值
select
user_id
, date_sub(log_in_date, rank) dts
from
(
select
user_id
, log_in_date
, row_number() over(
partitioned by user_id
order by
log_in_date desc
) as rank
from
user_log
) t
結果:
u0001 2019-10-09
u0001 2019-10-09
u0001 2019-10-09
u0001 2019-10-10
u0001 2019-10-10
u0001 2019-10-11
u0001 2019-10-11
u0001 2019-10-11
u0001 2019-10-11
u0002 2019-10-19
Step3:按第二列分組求和
select
user_id
, count(1) as num
from
(
select
user_id
, date_sub(log_in_date, rank) dts
from
(
select
user_id
, log_in_date
, row_number() over(
partitioned by user_id
order by
log_in_date desc
) as rank
from
user_log
) t
) a
group by dts
結果:
u0001 2019-10-09 3
u0001 2019-10-10 2
u0001 2019-10-11 4
u0002 2019-10-19 1
Step4:求最大次數
略