题解 | #连续签到领金币#
连续签到领金币
https://www.nowcoder.com/practice/aef5adcef574468c82659e8911bb297f
# 计算每个用户2021年7月以来每月获得的金币数(该活动到10月底结束,11月1日开始的签到不再获得金币)。结果按月份、ID升序排序 select uid, date_format (dt, '%Y%m') month, # 用户每天签到可以领1金币,并可以开始累积签到天数,连续签到的第3、7天分别可额外领2、6金币 sum( case when coin = 3 then 3 when coin = 0 then 7 else 1 end ) coin from ( select uid, dt, mod( # 连续签到的第几天 rank() over ( partition by uid, start_day order by dt ), 7 ) coin from ( select uid, dt, # 连续签到的开始时间 dt - r start_day from ( # 签到的第几天 select distinct uid, date (in_time) dt, rank() over ( partition by uid order by date (in_time) ) r from tb_user_log where date (in_time) between '2021-07-07' and '2021-10-31' # 只有artical_id为0时sign_in值才有效 and sign_in = 1 and artical_id = 0 ) tb_sign ) tb_start ) tb_value group by uid, date_format (dt, '%Y%m')