【牛客】SQL136 每类试卷得分前3名-窗口函数

文章介绍了如何从数据库中筛选出有作答得分的SQL和算法试卷,通过计算每个用户的最高分、最低分和排名,找出每类试卷的前3名。两种方法都利用了窗口函数进行排序。
摘要由CSDN通过智能技术生成

描述

现有试卷信息表examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间):

idexam_idtagdifficultydurationrelease_time
19001SQLhard602021-09-01 06:00:00
29002SQLhard602021-09-01 06:00:00
39003算法medium802021-09-01 10:00:00

试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分):

iduidexam_idstart_timesubmit_timescore
1100190012021-09-01 09:01:012021-09-01 09:31:0078
2100290012021-09-01 09:01:012021-09-01 09:31:0081
3100290022021-09-01 12:01:012021-09-01 12:31:0181
4100390012021-09-01 19:01:012021-09-01 19:40:0186
5100390022021-09-01 12:01:012021-09-01 12:31:5189
6100490012021-09-01 19:01:012021-09-01 19:30:0185
7100590032021-09-01 12:01:012021-09-01 12:31:0285
8100690032021-09-07 10:01:012021-09-07 10:21:0184
9100390032021-09-08 12:01:012021-09-08 12:11:0140
10100390022021-09-01 14:01:01(NULL)(NULL)

找到每类试卷得分的前3名,如果两人最大分数相同,选择最小分数大者,如果还相同,选择uid大者。由示例数据结果输出如下:

tiduidranking
SQL10031
SQL10042
SQL10023
算法10051
算法10062
算法10033

解释:有作答得分记录的试卷tag有SQL和算法,SQL试卷用户1001、1002、1003、1004有作答得分,最高得分分别为81、81、89、85,最低得分分别为78、81、86、40,因此先按最高得分排名再按最低得分排名取前三为1003、1004、1002。

方法一:

select * from
    (select
    tid,uid,
    row_number() over(partition by tid order by down_rnk) as ranking
    from
        (select
        tid,uid,
        dense_rank() over(partition by tid order by max_score desc) as down_rnk,
        dense_rank() over(partition by tid order by min_score desc) as up_rnk
        from
            (select
            tag as tid,
            uid,
            max(score) as max_score,
            min(score) as min_score
            from
            exam_record left join examination_info using(exam_id)
            where submit_time is not null
            group by uid,tid)t1
        order by tid,down_rnk,up_rnk,uid desc)t2
    )t3
where ranking<=3

方法二:

select *
from
    (select tag as tid,uid,
    row_number() over(partition by tag order by max(score) desc,min(score) desc,uid desc) as ranking
    from
    exam_record left join examination_info using(exam_id)
    where submit_time is not null
    group by uid,tid)t1
where ranking<=3
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值