計算連續登陸最大天數

背景:在網站平臺類業務需求中用戶的「最大登陸天數」,需求比較普遍。

原始數據:

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:求最大次數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章