# 大牛太神了!跟着大牛的思路写的 # 只有artical_id为0时, sign_in值才有效。 # 用户行为日志表,时间范围是2021-07-07 00:00:00 到 2021-10-31 23:59:59 # 第一步,提取有效登陆日期,去重 with t1 as( select distinct uid, date(in_time) as dt, row_number() over(partition by uid order by date(in_time)) as rn from tb_user_log where date(in_time) between "2021-07-07" and "2021-10-31" and artical_id = 0 and sign_in = 1 ), # 如果日期是连续的,那么dt_tmp的值就相等,如果不连续,那么就不同,可以用dt_tmp来分组,分成连续的不同时段.再对每一个uid-dt_tmp的小组里面,分组。 # 第二步,使用连续的天数除以7取余数,如果余0就是7个金币,如果余3就是3个金币, 其他就是1个金币 t2 as( select *, DATE_SUB(dt,interval rn day) as dt_tmp, case (row_number() over(partition by DATE_SUB(dt,interval rn day), uid order by dt))%7 when 0 then 7 when 3 then 3 else 1 end as coins from t1 ) # 计算每个用户,每月获得的金币数,按月份、ID升序排序。 # 第三步,用t2表,用户-月份分组,求总和 select uid, date_format(dt,"%Y%m") as month, sum(coins) as coin from t2 group by uid, date_format(dt,"%Y%m") order by date_format(dt,"%Y%m"),uid