Получить первый% p значений столбца - PullRequest
0 голосов
/ 24 марта 2019

Предположим, у нас есть таблица:

Students (First_Name, Last_Name, Section_Name, Grades_Avg)

Мне нужно написать запрос, который получает первый% p (параметр процедуры) студентов для каждого раздела с атрибутами (First_Name, Last_Name, Section_Name, Grades_Mean), в порядке убывания после Grades_Avg, в порядке возрастания после Last_Name, с Grades_Avg> 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 Ответ

2 голосов
/ 24 марта 2019

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() достигают этого.

...