题解 | #连续两次作答试卷的最大时间窗#

连续两次作答试卷的最大时间窗

https://www.nowcoder.com/practice/9dcc0eebb8394e79ada1d4d4e979d73c

select uid,
# 取用户连续2次作答试卷的最大值
max(days_window) days_window,
# 用户累计作答的试卷数/用户作答试卷的最大时间窗=用户平均每天作答的试卷数
# 用户平均每天作答的试卷数*用户连续2次作答试卷的最大值=avg_exam_cnt
round(max(exam_cnt)/max(max_days_window)*max(days_window),2) avg_exam_cnt
from
(select uid,date(start_time) s_day,
# 通过偏移窗口函数计算连续2次作答试卷的时间窗
#第二次作答试卷的时间 lead(date(start_time))over(partition by uid order by date(start_time))
timestampdiff(day,date(start_time),lead(date(start_time))over(partition by uid order by date(start_time)))+1 days_window,
# 每个用户在统计时间内,第一次和最后一次作答试卷的时间窗
timestampdiff(day,min(date(start_time))over(partition by uid),max(date(start_time))over(partition by uid))+1 max_days_window,
# 每个用户累计作答的试卷数
count(exam_id)over(partition by uid) exam_cnt
from exam_record where year(start_time)=2021)t
where uid in 
( select uid from
#  通过排序可筛选出用户作答的天数,dense_rank()可对相的日期不增加排名,
#  并通过排名筛选出最少有2天作答的用户uid
    (select uid,
dense_rank()over(partition by uid order by date(start_time)) rk
from exam_record  where year(start_time)=2021)t1 where rk>=2)
group by uid
order by 2 desc,3 desc

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务