们来看一个用户签到的问题

们来看一个用户签到的问题 【题目】给定一张用户签到表user_attendence,表中包含三个字段,分别是用户ID:【user_id】,日期:【date】,是否签到:【is_sign_in】,0否1是。 【问题1】计算截至当前,每个用户已经连续签到的天数: 要求输出用户ID【user_id】和连续签到天数【recent_continuous_days】 针对问题1,有一种非常巧妙的解法——只需要利用Max和datediff函数就行啦 也就是说,我们只要找到用户最近一次没有签到的日期,计算和当前日期的差值即可。 【问题2>】计算有史以来用户最大连续签到天数: 要求输出用户ID【user_id】和最大连续签到天数【max_continuous_days】 也可以运用窗口函数row_number,给所有签到记录为1的列排序号,这里也有一种很巧妙的思想,就用每行的签到日期减去序号,如果签到日期是连续的话,求得的值则是相同值,一旦日期不连续,将会求得一个新的相同值,这样的话,可以统计每个值的数量,进而判定最长签到天数。 我们来举个例子,下面这个图呢,是用户1在4月20日到4月27日的签到记录,其中4月23日没有签到,可以发现差值为19和20,其中20出现次数最多,有4次,说明该用户最大连续签到天数为4天。 不过有一点需要我们注意的是,求得的【值】必须唯一,上图中的数字显然不唯一。这里可以用日期去当作这个【差值】,毕竟日期具有唯一性,可以考虑运用MySQL中的DATE_SUB函数。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务