SQL28 多个窗口函数的应用

第二快/慢用时之差大于试卷时长一半的试卷

https://www.nowcoder.com/practice/b1e2864271c14b63b0df9fc08b559166?tpId=240&tqId=2183405&ru=/exam/oj&qru=/ta/sql-advanced/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3DSQL%25E7%25AF%2587%26topicId%3D240

思路分析:

找到第二快和第二慢用时之差大于试卷时长的一半的试卷信息,按试卷ID降序排序:

  • 找到第二快和第二慢;
  • 筛选出用时之差>试卷时长的一半的试卷
  • 提取这些试卷的试卷信息并按试卷ID排序

具体分析——一步一表:

  • 找到第二快和第二慢——应用两次窗口函数
row_number() over (partition by exam_id order by timestampdiff(second,start_time,submit_time) desc) as rn1,
row_number() over (partition by exam_id order by timestampdiff(second,start_time,submit_time) asc) as rn2
  • 计算出用时之差

由于对两列指定数据进行加和比较困难,不如把每类的若干条数据都进行加和,但设置条件:

sum(case when rn1=2 then duration0 when rn2=2 then -duration0 else 0 end)

此处注意,由于是对每类进行加和,最后要+group by

  • 筛选并提取试卷信息
select exam_id,duration,release_time
……
where sub>30*duration

也就是把上一步的筛选工作放在这一步用where语句执行

提交答案

select exam_id,duration,release_time
from
    (select exam_id,duration,release_time,
    sum(case when rn1=2 then duration0 when rn2=2 then -duration0 else 0 end)
    as sub
    from
        (select uid,er.exam_id,duration,release_time,
        timestampdiff(second,start_time,submit_time) as duration0,
        row_number() over (partition by exam_id 
        order by timestampdiff(second,start_time,submit_time) desc) as rn1,
         row_number() over (partition by exam_id 
        order by timestampdiff(second,start_time,submit_time) asc) as rn2
         from exam_record as er
         join examination_info as ei
         on er.exam_id=ei.exam_id 
         where submit_time is not null
        ) as q1
     group by exam_id
    ) as q2
where sub>30*duration
order by exam_id desc

全部评论

相关推荐

吴offer选手:我卡在笔试才是最好笑的,甚至没给我发过笔试链接
投递哔哩哔哩等公司6个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务