假设我们有表格:
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)的信息,所以我得到了所有部分的总和。
答案 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()
会达到这一目标。