select uid, date_format(dt,'%Y%m') as month, sum(case when rk2=3 then 3 when rk2=0 then 7 else 1 end) as coin # 用户每天签到可以领1金币,连续签到的第3、7天分别领3、7金币。每连续第8天签到时记为新的一轮签到的第一天,领1金币 from ( select uid, dt, dense_rank()over(partition by uid,rk1 order by dt)%7 as rk2 from ( select uid, date(in_time) as dt, date_sub(date(in_time), interval dense_rank()over(partition by uid order by date(in_time)) day ) as rk1 # 跨天了,也只记作in_time对应的日期签到了 from tb_user_log where date(in_time) between '2021-07-07' and '2021-10-31' #2021年7月7日0点开始(该活动到10月底结束,11月1日开始的签到不再获得金币) and artical_id =0 and sign_in=1 # artical_id为0时sign_in值才有效。 ) as t ) as t1 group by uid,month order by month,uid # 结果按月份、ID升序排序。