题解 | 最长连续登录天数(和官方解法不同)
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 是常数,所以只要对日期序列减去他们的序数,就能得到连胜开始日期,此时只需统计连胜开始日期的出现次数即可。

查看14道真题和解析