Как отобразить строки из максимального количества? - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу вернуть все данные из запроса максимального числа больниц, в которых больше всего пациентов. То, что я получаю, когда пытаюсь вложить запросы, - это отображение всех строк данных больницы. Я пытался посмотреть на подобные вопросы в переполнении стека и на других сайтах, кажется, что это простой запрос, но я его не получаю.

select max(highest_hospital) as max_hospital
from (select count(hospital) as highest_hospital
from doctor
group by hospital)

highest_hospital
-------------
            3

Doc ID  Doctor           Patient               Hospital    Medicine   Cost
------ -------           ------            ---------      ------     --------
1      Jim Bob         Patient1             Town 1        Medicine 1   4000
2      Janice Smith    Patient2             Town 2        Medicine 3    3000
3      Harold Brown    Patient3             Town 2        Medicine 5    2000
4      Larry  Owens    Patient4             Town 2        Medicine 6    3000
5      Sally Brown     Patient5             Town 3        Medicine 7    4000
6      Bob Jim         Patient6             Town 4        Medicine 8     6000

Результат должен быть возвращен из 3 строк

Doc ID  Doctor           Patient               Hospital    Medicine   Cost
------ -------           ------            ---------      ------     --------
2      Janice Smith    Patient2             Town 2        Medicine 3    3000
3      Harold Brown    Patient3             Town 2        Medicine 5    2000
4      Larry  Owens    Patient4             Town 2        Medicine 6    3000

1 Ответ

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

Вы можете использовать функции окна:

select d.*
from (select d.*, max(hospital_count) over () as max_hospital_count
      from (select d.*, count(*) over (partition by hospital) as hospital_count
            from doctor d
           ) d
     ) d
where hospital_count = max_hospital_count;

Редактировать:

Использование GROUP BY - это боль. Если вы ищете только одну больницу (даже если есть связи), то в Oracle 12 C вы можете сделать:

select d.*
from doctor d
where d.hospital = (select d2.hospital
                    from doctor d2
                    group by d2.hospital
                    order by count(*) desc
                    fetch first 1 row only
                   );

Вы можете сделать это в более ранних версиях Oracle используя дополнительный подзапрос.

...