目前有个需求,统计一个班里,每个人抛除其最高的5科和最低的5科的成绩,其他的成绩里
面的最高分、最低分、平均分。
数据库就两个字段:学生id,成绩。
这里想用sql来完成,这样java部分就可以简单
但不知道怎么用sql或存储过程来完成
有谁能帮帮忙,谢谢

解决方案 »

  1.   

    --以下分sql server和oracle分别计算.
    --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
      

  2.   

    select 学生id,max(成绩),min(成绩),avg(成绩)
    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
      

  3.   

    select   学生id,max(成绩),min(成绩),avg(成绩) 
    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行