题解 | 最长连续登录天数(和官方解法不同)
with a as( select user_id,fdate, cast(diff as SIGNED) - cast(sign1 as SIGNED) as sign from( select user_id,fdate, datediff(fdate,'2023-01-01') diff, row_number() over(partition by user_id order by fdate ) as sign1 from tb_dau where fdate between '2023-01-01' and '2023-01-31') aa ) select user_id,max(cnt) max_consec_days from ( select user_id, sign,count(1) cnt from a group by sign,user_id ) bb group by user_id
数学化的语言
找最大连续登录天数-->
找所有连续登录的日期-->
找到日期序列中公差为1的数列然后计算长度。
就是找到用户的登录数列中最长的公差为1的等差数列的长度。
我们知道等差数列a_n=a_0+(n-1)*d,在日期序列中,公差d为1,因此a_n=a_0+(n-1)。n为序数
对a_n来说,a_n-n=a_0 - 1 是常数,所以只要对日期序列减去他们的序数,就能得到连胜开始日期,此时只需统计连胜开始日期的出现次数即可。