SELECT uid, month, SUM(every_partition_coin) coin FROM
(SELECT uid, month, (CASE WHEN MOD(continue_count,7)>=3
THEN FLOOR(continue_count/7)*8+2+continue_count
WHEN MOD(continue_count,7)<3
THEN FLOOR(continue_count/7)*8+continue_count END) every_partition_coin
FROM
(SELECT uid, month, COUNT(*) continue_count FROM
(SELECT uid, dt, month, ROW_NUMBER() over (partition by uid order by dt) rk FROM
(SELECT DISTINCT uid, DATE_FORMAT(in_time,'%Y-%m-%d') dt, DATE_FORMAT(in_time,'%Y%m') month
FROM tb_user_log
WHERE artical_id=0 AND sign_in=1
AND DATE(in_time) BETWEEN '2021-07-07' AND '2021-10-31') t1
) t2
GROUP BY uid, month, DATE_SUB(dt, INTERVAL rk DAY)
) t3
) t4
GROUP BY uid, month
ORDER BY month, uid
用找#某宝店铺连续2天及以上购物的用户及其对应的天数#的思路 https://blog.nowcoder.net/n/19758260181f4018b24e1c2edf690f32
这里有一个小坑是,如果用in_time BETWEEN '2021-07-07' AND '2021-10-31'是不对的,因为这样是指in_time BETWEEN '2021-07-07 00:00:00' AND '2021-10-31 00:00:00'的意思,会漏掉10-31的时间。(between and 包括两端值)