WITH a AS ( SELECT uid, DATE(in_time) AS dt, ROW_NUMBER() OVER (PARTITION BY uid ORDER BY in_time) AS rn FROM tb_user_log WHERE artical_id = 0 AND sign_in = 1 AND DATE(in_time) BETWEEN '2021-07-07' AND '2021-10-31' ), b AS ( SELECT uid, DATE_FORMAT(MIN(dt), "%Y%m" ) AS month, COUNT(*) AS cnt FROM a GROUP BY uid, DATE_SUB(dt, INTERVAL rn DAY) ORDER BY uid, month ) SELECT uid, month, SUM(CASE WHEN cnt <= 7 THEN CASE WHEN cnt % 7 > 0 and cnt % 7 < 3 THEN cnt WHEN cnt % 7 >= 3 and cnt % 7 < 7 THEN cnt+2 WHEN cnt % 7 = 0 THEN cnt+2+6 END ELSE FLOOR(cnt / 7) * (7 + 2 + 6) + CASE WHEN cnt % 7 > 0 AND cnt % 7 < 3 THEN cnt % 7 WHEN cnt % 7 >= 3 AND cnt % 7 < 7 THEN cnt % 7 + 2 WHEN cnt % 7 = 0 THEN 0 END END) AS coin FROM b GROUP BY uid, month ORDER BY month, uid # artical_id = 0 AND sign_in = 1 # DATE(in_time) BETWEEN '2021-07-07' AND '2021-10-31' # COIN = 每日签到1金币+连续签到3、7天奖励金币 # GROUP BY uid # ORDER BY month, uid