SELECT uid, 
    DATE_FORMAT(DATE_ADD(new_dt, INTERVAL 1 DAY), '%Y%m') AS month,
    SUM(day_coin) AS coin
FROM (
    -- 获取各uid每个消费日期与其日期排名的差值,差值一样的消费日期即为连续签到的日期,
    -- 对差值和uid重新用窗口函数进行分组排序,计算每天获得的金币数(连续签到三天、七天时,第三天获得2+1=3个金币,第七天获得6+1=7个金币)
    SELECT uid, dt, dt_rank,
        DATE_SUB(dt, INTERVAL dt_rank DAY) AS new_dt,
        CASE DENSE_RANK() OVER(PARTITION BY DATE_SUB(dt, INTERVAL dt_rank DAY), uid ORDER BY dt) % 7
            WHEN 3 THEN 3
            WHEN 0 THEN 7
            ELSE 1
        END AS day_coin
    FROM (
        -- 使用窗口函数,对各uid有签到的日期进行排序
        SELECT uid, 
            DATE(in_time) AS dt,
            DENSE_RANK() OVER(PARTITION BY uid ORDER BY DATE(in_time)) AS dt_rank
        FROM tb_user_log
        WHERE DATE(in_time) BETWEEN '2021-07-07' AND '2021-10-31'
            AND artical_id = 0 AND sign_in = 1
    )rank_t
)sub_dt_t
GROUP BY uid, month
ORDER BY month, uid