with coin_table as ( select uid ,date_format(dt,'%Y%m') as month ,case row_number()over(partition by uid, rk_tag order by dt)%7 when 3 then 3 when 0 then 7 else 1 end as coin_eachday from ( select uid ,dt ,date_sub(dt,interval rk day) rk_tag from ( select uid ,date(in_time) dt ,row_number()over(partition by uid order by date(in_time)) rk from tb_user_log where artical_id=0 and sign_in=1 and date(in_time) between '2021-07-07' and '2021-10-31' ) t ) t ) select uid ,month ,sum(coin_eachday) coin from coin_table group by 1,2 order by 2,1
关于连续第几天
- 假设一组日期数据为[0,1,2,4,7,8],我们想按照连续性分组为[0,1,2]、[4]、[7,8]
- 我们先做序号列[1,2,3,4,5,6](通过RANK OVER(uid)实现)
- 然后序号-日期数据=[1,1,1,0,-2,-2],得到能实现连续性分组的特征标签(即上面的三个分组111,0,-2-2)
- 按分组再加序号[1,2,3,1,1,2](通过RANK OVER(uid,特征标签) 实现)(每组内的排序序号,即第几个连续天)