题解 | #连续签到领金币#
连续签到领金币
http://www.nowcoder.com/practice/aef5adcef574468c82659e8911bb297f
从最终结果出发方向推导实现目标的步骤:
- 最终目标是用户每个月获取的金币数据量, 要实现这一数据的统计,需要知道用户在活动期间每天获得的金币数量。
- 用户每天获得的金币数量是根据用在活动期间连续签到的天数决定的, 因此需要计算用户在活动期间连续签到的天数。
- 用户在活动期间连续签到的天数是根据用户签到(article_id = 0 & sign = 1)的日期(in_time)进行判断的。
因此, 实现最终目标的路径可以分为以下四步:
- 筛选出活动期间用户签到的数据: uid, date
- 计算用户连续签到的天数, 可以根据签到日期进行排序、求差、再排序算出连续签到的天数
- 根据签到领金币的规则, 给用户每天的签到情况赋值(发放金币)
- 最后, 以用户和月份为单位做统计
select uid,
date_format(dt, "%Y%m") as month,
sum(coin) as coin
from (
select uid,
dt,
case row_number() over (partition by uid, tp_dt order by dt) % 7
when 3 then 3
when 0 then 7
else 1
end as coin
from (
select uid,
dt,
date_sub(dt, interval row_number() over (partition by uid order by dt) day) as tp_dt
from (
select distinct
uid,
date(in_time) as dt
from tb_user_log
where date(in_time) between "2021-07-07"and "2021-10-31"
and artical_id = 0
and sign_in = 1
) as a
) as b
) as c
group by uid,
month
order by month,
uid