获取列值的前%p个

时间:2019-03-24 11:00:38

标签: sql oracle oracle12c

假设我们有表格:

Students (First_Name, Last_Name, Section_Name, Grades_Avg)

我需要编写一个查询,以获取每个部分的第一个学生的%p(过程的参数)以及属性(First_Name,Last_Name,Section_Name,Grades_Mean),在Grades_Avg之后降序,在Last_Name之后升序,成绩平均> 5。

我的工作:

select First_Name, Last_Name, Section_Name, Grades_Avg 
from STUDENTS where Grades_Avg>5 
ORDER BY Section_Name, Grades_Avg DESC 
FETCH FIRST p PERCENT ROWS ONLY;

但是有了这个,我没有得到每个Section_Name(第一个%p)的信息,所以我得到了所有部分的总和。

1 个答案:

答案 0 :(得分:2)

Oracle有一个名为percent_rank()的功能,可能可以提供帮助:

select s.*
from (select s.*,
             percent_rank() over (partition by section order by grades_avg) as p_rank
      from students s
      where s.grades_avg > 5
     ) s
where p_rank <= p;

这假设p是介于0和1之间的数字。如果介于0和100之间,则:

where p_rank <= p / 100

请注意,同一年级的学生具有相同的p_rank值,因此他们包括全部或全部不包括在内。

如果您希望返回一个准确的数字-例如,即使所有学生都具有相同的成绩,也要尽可能接近20%,那么row_number()count()会达到这一目标。