HIVE SQL:某一类别试卷得分的截断平均值

题目描述:
计算所有用户完成SQL类别**高难度试卷得分的截断平均值(去掉一个最大值和一个最小值后的平均值)。
例子:试卷9001为高难度SQL试卷,该试卷被作答的得分有[80,81,84,90,50],去除最高分和最低分后为[80,81,84],平均分为81.6666667,保留一位小数后为81.7

主要字段:
表1:examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间)
表2:exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分)

方法一:公式法

select
    tag,
    difficulty,
    round((sum(score)-min(score)-max(score))/(count(er.score)-2),1)
from exam_record as er 
left join examination_info as ei
on er.exam_id=ei.exam_id
where er.score is not null and difficulty='hard' and tag='SQL'
group by tag,difficulty

方法二:利用窗口函数排序后,去掉每组exam_id非NULL行的分数求平均;(这个是自己想的思路,比较笨)

select
    tag,
    difficulty,
    round(avg(score),1) as avg_score
from 
(select
    er.exam_id,
    tag,
    difficulty,
    score,
    row_number() over(partition by er.exam_id order by score ) as r,
    lag(score,1,null) over(partition by er.exam_id order by score) as lag_score,
    lead(score,1,null) over(partition by er.exam_id order by score) as lead_score
from exam_record as er 
left join examination_info as ei
on er.exam_id=ei.exam_id
where er.score is not null and difficulty='hard' and tag='SQL')a
where lag_score is not null and lead_score is not null
group by tag,difficulty
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值