题解 | 最长连续登录天数(和官方解法不同)

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 是常数,所以只要对日期序列减去他们的序数,就能得到连胜开始日期,此时只需统计连胜开始日期的出现次数即可。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务