题解 | #连续签到领金币#

连续签到领金币

http://www.nowcoder.com/practice/aef5adcef574468c82659e8911bb297f

这题可谓是非常高质量了!! 大家如果刚开始不会可以先去做SQL29 里面有连续天数的计算方法!!!!(强烈推荐) 1.我们只要先排序,再将日期减去排序值就可以得到第一天连续打卡的时间,从而解决打断的问题。tmp表是得到排序数,base表是减去排序值。 2.之后我们根据 用户 和 每个阶段连续打卡的第一天 进行分组就可以得到今天是连续打卡的第几天 3.之后根据数学规则mod7就可以根据规则得到改天得到的金币 4.再根据月进行聚合求sum即可

select uid,date_format(sign_dt,"%Y%m") as mon,sum(coin)
from
(select uid,TIMESTAMPADD(day,-diff+1,sign_dt) as start_dt,
       case (DENSE_RANK() over(partition by uid ,TIMESTAMPADD(day,-diff+1,sign_dt)
                        order by sign_dt))%7  when 3 then 3
                                                 when 0 then 7
                                                 else 1 end as coin,
      sign_dt
from
(select uid,DATE_FORMAT(in_time,"%Y%m%d") as sign_dt,
       DENSE_RANK() over(partition by uid order by DATE_FORMAT(in_time,"%Y%m%d"))
       as diff
from tb_user_log
where DATE_FORMAT(in_time,"%Y%m%d") between "20210707" and "20211031"
      and artical_id=0 and sign_in=1) tmp) base
group by uid,date_format(sign_dt,"%Y%m")
order by mon,uid
全部评论
请问为什么-diff+1呀 这个1是什么意思呀 谢谢大佬
点赞 回复 分享
发布于 2022-03-03 11:59
大佬你好,想问下为什么是从2021年7月7日开始计算,这样month(in_time) between 7 and 10为什么不可以呀
点赞 回复 分享
发布于 2022-03-21 12:09
感觉直接用rank也可以,每个用户的登录时间可以用distinct只记录一天的
点赞 回复 分享
发布于 2022-04-30 13:06
为什么这么改就不对了呢 timestampdiff(day,diff-1,sign_dt)
点赞 回复 分享
发布于 2022-06-02 11:06

相关推荐

点赞 评论 收藏
分享
伟大的烤冷面被普调:暨大✌🏻就是强
点赞 评论 收藏
分享
评论
36
8
分享
牛客网
牛客企业服务