题解 | #连续签到领金币#
连续签到领金币
https://www.nowcoder.com/practice/aef5adcef574468c82659e8911bb297f
#忘了思考连续的问题了
#date:[0,1,2,5,7]
#row_number;[1,2,3,4,5]
#row_number-dat:[1,1,1,-1,2]
#按照row_number 进行分组,一个组是一个连续
SELECT uid
,date_format(dt,'%Y%m') AS month
,sum(coin_cnt)as coin
FROM(
SELECT
uid
,dt
,case when mod(mod(rnk,7),3)=0 and mod(mod(rnk,7),2)<>0 then 3
when mod(sgn_cnt,7)=0 then 7
else 1 end as coin_cnt
FROM(
SELECT *
,dense_rank() over(partition by uid, date_add(dt, interval -sgn_cnt day) order by dt) rnk
FROM(
SELECT uid
,date_format(in_time,'%Y%m%d')AS dt
,dense_rank()OVER (PARTITION BY uid order by date_format(in_time,'%Y%m%d')asc)AS sgn_cnt
FROM tb_user_log
WHERE date_format(in_time,'%Y%m%d')>=20210707
AND date_format(in_time,'%Y%m%d')<20211101
AND artical_id=0
AND sign_in=1
GROUP BY 1,2
)AS a
)AS b
)AS c
GROUP BY uid,month
ORDER BY month,uid

查看3道真题和解析