from(select uid,dt,(1+#基础积分+符合条件的额外加分
case
when ar=3 and sign_in=1 then 2
when ar=7 and sign_in=1 then 6
when sign_in=0 then -1#排除没签到还被计一分的情况
else 0
end) as arr
from(select uid,dt,sign_in,ar,dense_rank() over (partition by uid,day(dt)-ar+1 order by dt)ar1#以每组签到周期的第一天为分组依据,解决断签重算的问题
from(select uid,date(in_time)dt,sign_in,(dense_rank() over (partition by uid,sign_in order by date(in_time))%7+#这步解决7日一循环的排序
case when dense_rank() over (partition by uid,sign_in order by date(in_time))%7=0 then 7 else 0#这步将第7天的排序值0变为7
end) as ar
from tb_user_log)b1)b2)b3
group by uid,d