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

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-28 19:45   28   0

2b7aeb61e807ce1f771c7d8818e0a1b0.png

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

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

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

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

思路:

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

9de805498de222512873ae4f48be2daf.png
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; /*④ 求出最大值*/

84f560639512872fd331a95b079ca3b6.png
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP