mysql 连续天数_MYSQL面试题:统计连续打卡天数
数据蛙练习题:现在有一张表t,这张表存储了每个员工每天的打卡情况,现在需要统计截止目前每个员工的连续打卡天数,如下表所示:表1.jpg上表中uid是用户id,tdate是日期,is_flag是记录用户当天是否打卡,1为打卡,0为未打卡。我们希望得到的结果为:result.jpg建表代码如下:drop table if exists clock_in;create table clock_in(ui
数据蛙练习题:
现在有一张表t,这张表存储了每个员工每天的打卡情况,现在需要统计截止目前每个员工的连续打卡天数,如下表所示:
表1.jpg
上表中uid是用户id,tdate是日期,is_flag是记录用户当天是否打卡,1为打卡,0为未打卡。
我们希望得到的结果为:
result.jpg
建表代码如下:
drop table if exists clock_in;
create table clock_in(uid int, tdate datetime, is_flag int);
insert into clock_in values(1, '2020/2/1', 1);
insert into clock_in values(1, '2020/2/2', 0);
insert into clock_in values(1, '2020/2/3', 1);
insert into clock_in values(1, '2020/2/4', 1);
insert into clock_in values(1, '2020/2/5', 0);
insert into clock_in values(1, '2020/2/6', 1);
insert into clock_in values(1, '2020/2/7', 1);
insert into clock_in values(1, '2020/2/8', 1);
insert into clock_in values(2, '2020/2/1', 1);
insert into clock_in values(2, '2020/2/2', 0);
insert into clock_in values(2, '2020/2/3', 0);
insert into clock_in values(2, '2020/2/4', 1);
insert into clock_in values(2, '2020/2/5', 1);
insert into clock_in values(2, '2020/2/6', 1);
insert into clock_in values(2, '2020/2/7', 1);
insert into clock_in values(2, '2020/2/8', 1);
参考网上的答案,以一个连续的数字和打卡日期相减,但是当打卡日期跨月时如何计算呢?
我的思路是:
1、先按照日期排序,用窗口函数生成连续的数字 rn
2、筛选is_flag 为1的部分,再使用窗口函数生成连续数字 rm
3、1表和2表内连接后,rn - rm
4、对3表中的rn-rm进行分组计数,得到连续打卡天数
5、对4表的数据选择最大的打卡天数即可
SELECT
t2.uid uid,
max( t2.cc ) AS flag_days
FROM
(
SELECT
t.uid,
count( t.rn - t.rm ) AS cc
FROM
(
SELECT
a.uid,
a.tdate,
a.is_flag,
b.rn,
row_number () over ( PARTITION BY a.uid ORDER BY a.tdate ) AS rm
FROM
clock_in a
INNER JOIN ( SELECT uid, tdate, is_flag, row_number () over ( PARTITION BY uid ORDER BY tdate ) AS rn FROM clock_in ) b ON a.uid = b.uid
AND a.tdate = b.tdate
AND a.is_flag = 1
) t
GROUP BY
t.uid,
t.rn - t.rm
) t2
GROUP BY
t2.uid;

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)