目前有个需求,统计一个班里,每个人抛除其最高的5科和最低的5科的成绩,其他的成绩里
面的最高分、最低分、平均分。
数据库就两个字段:学生id,成绩。
这里想用sql来完成,这样java部分就可以简单
但不知道怎么用sql或存储过程来完成
有谁能帮帮忙,谢谢
面的最高分、最低分、平均分。
数据库就两个字段:学生id,成绩。
这里想用sql来完成,这样java部分就可以简单
但不知道怎么用sql或存储过程来完成
有谁能帮帮忙,谢谢
--sql server
select 学生id , max(成绩) 最高分 , min(成绩) 最低分 , avg(成绩) 平均分 from tb m where exists(select 1 from
(
select * from tb as t where (select count(*) from tb where 学生id = t.学生id and 成绩 < t.成绩) < 5
union all
select * from tb as t where (select count(*) from tb where 学生id = t.学生id and 成绩 > t.成绩) < 5
) n
where m.学生id = n.学生id and m.成绩 = n.成绩 and checksum(m.学生id , m.成绩) <> checksum(n.学生id , n.成绩))
group by 学生id--oracle
select 学生id , max(成绩) 最高分 , min(成绩) 最低分 , avg(成绩) 平均分 from tb where to_char(学生id) || to_char(成绩) not in
(
select to_char(学生id) || to_char(成绩) item from tb as t where (select count(*) from tb where 学生id = t.学生id and 成绩 < t.成绩) < 5
union all
select to_char(学生id) || to_char(成绩) item from tb as t where (select count(*) from tb where 学生id = t.学生id and 成绩 > t.成绩) < 5
)
group by 学生id
from (
select
row_number() over( partition by 学生id order by 成绩 ) as rn1,
row_number() over( partition by 学生id order by 成绩 desc) as rn2,
学生id, 成绩
from t01
order by 学生id, 成绩
)
where rn1 > 5 and rn2 > 5
group by 学生id
from (
select
row_number() over( partition by 学生id order by 成绩 ) as rn1,
row_number() over( partition by 学生id order by 成绩 desc) as rn2,
学生id, 成绩
from t01
order by 学生id, 成绩
)
where rn1 > 5 and rn2 > 5
group by 学生id
===================================或者=================
over(order by salary rows between 50 preceding and 150 following)每行对应的数据窗口是之前50行,之后150行