题解 | #连续签到领金币#
连续签到领金币
https://www.nowcoder.com/practice/aef5adcef574468c82659e8911bb297f
WITH login AS( SELECT uid, date(in_time) day, date_sub(date(in_time), interval row_number()over(partition by uid order by date(in_time)) day) grp FROM tb_user_log WHERE date(in_time) between '2021-07-07' and '2021-10-31' and artical_id = 0 and sign_in = 1 ) # SELECT * SELECT uid, month, sum( CASE WHEN rnk%7 = 3 THEN 3 WHEN rnk%7 = 0 THEN 7 ELSE 1 END ) coin FROM (SELECT uid, grp, date_format(day, '%Y%m') month, row_number()over(partition by uid, grp) rnk FROM login)t GROUP BY uid, month ORDER BY month, uid
首先设计临时表login,筛选可识别为成功登录的用户,并对用户以及其连续登录的日期进行分组,并保存每个组对应的月份信息。
对每个组内的数据再进行row_number()排序,确定当日为连续登录的第几天。对用户、‘连续登录组’进行分组,并用CASE...WHEN设置条件,计算每日对应的硬币数。
这个题……真的处处是坑啊!一开始怎么求都少4个币,发现是没有在‘连续登录组’里面进行排序……然后再求又一直多两个币,再检查题目和代码,发现活动从7月7号开始而不是7月1号!!想当然了就掉进坑里了qwq
#MySQL##连续签到领金币#