mysql 连续签到天数_求连续签到天数--用SQL


看来的一道题目,觉得挺有趣,收藏学习ヾ(◍°∇°◍)ノ゙

苏克1900:腾讯面试官出的 2 道经典数据分析面试题​zhuanlan.zhihu.com

题目:有一张用户签到表【sign】,标记每天用户是否签到(说明:该表包含所有用户所有工作日的出勤记录) ,包含三个字段:日期【fdate】,用户id【fuser_id】,用户当天是否签到【fis_sign_in:0否1是】

问题1:计算截至20200905每个用户已经连续签到的天数(结果仅包含20200905签到的所有用户,计算其连续签到天数)

思路:

筛选出未签到日期
按着fuser_id及fdate分组
找寻fuser_id最近一次未签到的日期(max)

SELECT t1.fuser_id,
DATEDIFF(20200905,t1.最近一次未签到时间) as 签到天数  FROM
(SELECT fuser_id,max(fdate) as 最近一次未签到时间 from sign
where fis_sign_in=0
group by fuser_id) t1
问题2:计算每个用户历史以来最大的连续签到天数(结果为用户签到表中所有出现过的用户,计算其历史最大连续签到天数)

对以往签到日期排序,如果连续签到,签到日期与序号的差值是一致的,以此为思路求解

SELECT t3.user_id,max(t3.date3) FROM
(SELECT t2.user_id,count(t2.date2) date3 FROM
(SELECT t1.user_id,DATE_SUB(t1.date,INTERVAL t1.ranking day) as date2 FROM
(SELECT *,
row_number() over (PARTITION by user_id order by date) as ranking 
from sign
where sign_in=1)t1/*① 筛选出每个user的签到日期,并排序*/
)t2/*② 签到日期减去签到排名,如果是连续签到,则得到的日期相同*/
GROUP BY t2.user_id,t2.date2)t3 /*③ 按照user_id分组,分别求出各连续签到的时间*/
GROUP BY t3.user_id; /*④ 求出最大值*/

————————————————
版权声明:本文为CSDN博主「weixin_39682697」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39682697/article/details/111695679

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值