Получить другие столбцы (атрибут) с максимальными значениями - PullRequest
1 голос
/ 22 апреля 2020

мой фрейм данных

ID      COURSE_ID SEC_ID SEMESTER YEAR  GRADE
00128   CS-101    1      Fall   2009    A
00128   CS-347    1      Fall   2009    A-
12345   CS-101    1      Fall   2009    C
....

Я хочу получить course_id & sec_id с максимальным количеством владельцев регистраций (count (id)) в падении 2009 года.

, поэтому я попытался

select course_id, sec_id, enrollment
from (select course_id, sec_id, count(ID) as enrollment
    from takes
    where semester = 'Fall' and year = 2009
    group by course_id, sec_id)

Однако это приведет к тому, что у каждого класса будут владельцы регистрации. Я хочу показать только те классы с максимальным количеством владельцев регистрации. Я думаю, что мне нужно использовать max , но теперь мне нужно решить его с помощью подраздела этого кода, из. (Из подзапроса)

++ Могу ли я решить это с помощью предложения has? Буду признателен, если вы сообщите мне, если сможете.

спасибо за чтение.

Ответы [ 3 ]

1 голос
/ 22 апреля 2020

Вы можете отфильтровать курсы с осени 2009 г., агрегировать по course_id и sec_id, отсортировать результаты по количеству строк в группе и использовать ограничивающее количество строк предложение для получения наиболее внимательного курса:

select course_id, sec_id, count(*) no_registrants
from takes
where semester = 'Fall' and year = '2009'
group by course_id, sec_id
order by no_registrants desc
fetch first 1 rows with ties

Это разрешает верхние связи, если таковые имеются. Если вам нужна только одна строка, вы можете изменить fetch first 1 rows with ties на fetch first 1 rows only. Возможно, вы захотите добавить второй критерий сортировки, чтобы результаты были детерминированы c (в противном случае это неопределенный курс, в котором будут отображаться связи).


В Oracle <12 c, где предложение ограничения строки недоступно, вместо него можно использовать <code>rank() (или row_number(), чтобы запретить связи):

select course_id, sec_id, no_registrants
from (
    select 
        course_id, 
        sec_id, 
        count(*) no_registrants,
        rank() over(order by count(*) desc) rn
    from takes
    where semester = 'Fall' and year = '2009'
    group by course_id, sec_id
) t
where rn = 1
0 голосов
/ 22 апреля 2020

Вы можете поместить свой подзапрос в CTE для его повторного использования:

with
x as (
  select course_id, sec_id, count(*) as enrollment
  from takes
  where semester = 'Fall' and year = 2009
  group by course_id, sec_id
)
select *
from x
where enrollment = (select max(enrollment) from x)
0 голосов
/ 22 апреля 2020

В соответствии с моим пониманием вашего требования, ваш запрос нужно просто изменить, чтобы получить правильный результат.

Чтобы получить только одну запись с наибольшим количеством владельцев регистрации. Используйте тот же запрос, просто добавьте указанные ниже изменения:

select course_id, sec_id, max(enrollment) as registrants
from (select course_id, sec_id, count(ID) as enrollment
from takes
where semester = 'Fall' and year = 2009
group by course_id, sec_id) as Rdet group by course_id,sec_id;

Это даст вам правильный результат в зависимости от ваших требований.

...