--mySQL

WITH log AS
(
    SELECT DISTINCT uid, DATE(in_time) AS dt
    FROM tb_user_log
    WHERE artical_id = 0
    AND sign_in = 1
    AND DATE(in_time) >= '2021-07-07'
    AND DATE(in_time) <= '2021-10-31'
),
log_sign_in AS
(
    SELECT uid, dt, ROW_NUMBER() OVER (PARTITION BY uid ORDER BY dt ASC) AS rm
    FROM log
),
log_sign_coin AS
(
    SELECT
        uid,
        dt,
        DATE_SUB(dt, INTERVAL rm DAY) AS dt_tmp,
        ROW_NUMBER() OVER (PARTITION BY uid, DATE_SUB(dt, INTERVAL rm DAY) ORDER BY dt)  % 7 AS con_sign
    FROM log_sign_in
),
log_coin AS
(
    select
    uid
    ,dt
    ,case when con_sign = 3 then 3
          when con_sign = 0 then 7
     else 1 end coin
    FROM log_sign_coin
)
select
uid
,date_format(dt, '%Y%m') month
,sum(coin) coin
FROM log_coin
group by 1,2
order by 1,2;

--SQL SERVER

Tips:先用CAST函数将日期字段转换为日期类型,然后再使用CONVERT函数将其转换为yyyymmdd的格式

with t1 as
(
    select DISTINCT uid,CONVERT(nvarchar(10),in_time,120) as dt
    from tb_user_log
    WHERE artical_id = 0 and sign_in = 1 and CONVERT(nvarchar(10),in_time,120) >= '2021-07-07' and CONVERT(nvarchar(10),in_time,120) <= '2021-10-31'
),
t2 as
(
    select uid,dt,ROW_NUMBER() over (partition by uid order by dt asc) as rm
    from t1
),
t3 as
(
    select uid,dt
    ,DATEADD(day,-rm,dt) as dt_tmp
    ,ROW_NUMBER() over (partition by uid,DATEADD(day,-rm,dt) order by dt asc) as coin_sign 
    from t2
),
t4 as
(
    select uid,dt
    ,case when coin_sign = 3 then 3
          when coin_sign = 0 then 7
     else 1 end coin
    from t3
)
select uid,CONVERT(varchar(6), CAST(dt AS date),112) as month
,SUM(coin) as sumCoin
from t4
group by uid,CONVERT(varchar(6), CAST(dt AS date),112)
ORDER BY uid,CONVERT(varchar(6), CAST(dt AS date),112)