今天来解一道题面试中可能经常会被一些面试官拿来“刁难”的题,就是《如何统计连续打卡天数》,当然了这里面的打卡可以换成任意其他行为,比如连续登陆天数,连续学习天数,连续购买天数,这里的天数也是可以换成小时或者别的时间单位的。这个问题的逻辑还是有点复杂,如果要是之前没遇到过这种问题,当场被问到的时候,肯定会一脸懵。
直接来看实战,现在有一张表t,这张表存储了每个员工每天的打卡情况,现在需要统计截止目前每个员工的连续打卡天数,表t如下表所示:

上表中uid是用户id,tdate是日期,is_flag是记录用户当天是否打卡,1为打卡,0为未打卡。
我们希望得到的结果为:

这个逻辑还是挺难想的,第一个想法就是通过前后数据偏移来实现,就是将is_flag向前移动一行或者向后移动一行,然后和原来的is_flag标签做差,如果结果为0,说明前后两天的值是相同的,要么都是0,要么都是1。但是还是不能够得出我们想要的结果。
再换一种思路:如果是连续打卡,那么打卡日期与一个递增的数字依次做差的结果值应该是相等的,不理解这句话没关系,看具体结果你就明白了。
我们先获取每个用户在这一段时间内所有打卡的排名,是所有打卡的排名哦,利用的是窗口函数的row_number(),代码如下:
select
uid
,tdate
,row_number() over(parti

本文介绍了如何使用MySQL解决统计连续打卡天数的问题,通过窗口函数row_number()获取打卡排名,并通过日期与排名的差值找出连续打卡的天数。文章提供了获取最近和历史最长连续打卡天数的方法,并强调了口径问题的重要性。
最低0.47元/天 解锁文章
1623

被折叠的 条评论
为什么被折叠?



