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

连续签到领金币

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

# 只有artical_id为0时sign_in值才有效
SELECT e.uid, e.month, SUM(e.coins) AS coin
FROM(
    SELECT d.uid, DATE_FORMAT(d.sign_date,"%Y%m") AS month,
        CASE WHEN MOD(d.sign_rk,7) = 3 THEN 3
             WHEN MOD(d.sign_rk,7) = 0 THEN 7
             ELSE 1 
        END AS coins
    FROM(
        SELECT c.uid, c.sign_date, c.sign_date_rk,
            ROW_NUMBER() OVER (PARTITION BY c.uid, c.diff ORDER BY c.sign_date) AS sign_rk
        FROM(    
            SELECT b.uid, b.sign_date, b.sign_date_rk,
                DATE_SUB(b.sign_date, INTERVAL b.sign_date_rk DAY ) AS diff
            FROM (
                SELECT a.uid, a.sign_date,
                    ROW_NUMBER() OVER (PARTITION BY a.uid ORDER BY a.sign_date) AS sign_date_rk
                FROM(
                    SELECT DISTINCT uid, DATE_FORMAT(in_time, "%Y%m%d" ) AS sign_date
                    FROM tb_user_log
                    WHERE artical_id = 0 
                    AND sign_in = 1 
                    AND DATE_FORMAT(in_time, "%Y%m%d" ) BETWEEN '20210707' AND '20211031'
                    GROUP BY uid, sign_date
                    ) AS a
                ) AS b
            ) AS c 
        ) AS d
    ) AS e
GROUP BY e.uid, month
ORDER BY month, e.uid
;

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务