题解 | #连续签到领金币#
连续签到领金币
http://www.nowcoder.com/practice/aef5adcef574468c82659e8911bb297f
思路
- 先计算连续登录的天数
- 题目解释给出连续7天可获得15个金币,连续3天可以获得5个金币,其余是1天一个金币,分三段计算:
- 判断大于7天,用连续签到天数除以7,取商(7的倍数)乘15 + 连续签到天数取模7(余数)除以3,取商(3的倍数)乘5 + 连续签到天数取模7再取模3(余下不足3天的天数)
(15 * truncate(dt_cnt/7 ,0))+(5 * truncate((dt_cnt%7)/3 ,0))+(1 * ((dt_cnt%7)%3))
- 判断大于3天,连续签到天数除以3,取商(3的倍数)乘5 + 连续签到天数取模7再取模3(余下不足3天的天数)
5 * truncate(dt_cnt/3 ,0)+ 1 * (dt_cnt%3)
- 余下的部分不到3天,每天签到得1金币
1 * dt_cnt
完整代码:
with sign as (
select uid ,mm,dt,subdate(dt,ra) as dts
from
(
select
uid
,date(in_time) as dt
,date_format(in_time,'%Y%m') as mm
,row_number() over(partition by uid order by date(in_time) asc ) ra
from tb_user_log
where artical_id=0
and sign_in=1
and date(in_time)>='2021-07-07' and date(in_time)<='2021-10-31'
)a
)
select
uid
,mm
,sum(case when dt_cnt >= 7 then (15 * truncate(dt_cnt/7 ,0))
+(5 * truncate((dt_cnt%7)/3 ,0))
+(1 * ((dt_cnt%7)%3))
when dt_cnt >= 3 then 5 * truncate(dt_cnt/3 ,0)
+ 1 * (dt_cnt%3)
else 1 * dt_cnt
end ) as coin
from ( select uid
,mm
,dts
,count(dt) dt_cnt
from sign group by 1,2,3 ) a
group by 1,2
order by mm,uid