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

连续签到领金币

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##连续签到领金币#
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务