Получение значений из столбца с помощью функции max с oracle sql, включая дубликаты - PullRequest
1 голос
/ 23 марта 2020

Я весь день пытался использовать функцию max для результатов запроса select внизу. Я хочу получить следующее:

ROOM    NURSES_PER_ROOM
RM2     1
RM1     .1666666666666666666666666666666666666667
RM3     1

Кому:

ROOM 
RM2      
RM3     

Где RM2 и RM3 имеют самое высокое отношение NURSES_PER_ROOM.

create table Nurse
(PIN varchar2(6) not null primary key,
first_name char(16),
last_name char(20));

create table Room
(number_ varchar2(6) not null primary key,
size_ varchar2(6) not null);

create table Allocation
(nurse varchar2(6) not null primary key,
room varchar2(6) not null,
foreign key (nurse) 
    references Nurse(PIN),
foreign key (room) 
    references Room(number_));

insert into nurse(PIN, first_name, last_name)
values ('NU0011', 'Mary', 'Fritz');
insert into nurse(PIN, first_name, last_name)
values ('NU0012', 'Goth', 'Mortimer');
insert into nurse(PIN, first_name, last_name)
values ('NU0013', 'Rosa', 'Lotta');
insert into nurse(PIN, first_name, last_name)
values ('NU0014', 'Josie', 'Josiah');
insert into nurse(PIN, first_name, last_name)
values ('NU0015', 'Ruth', 'Williams');
insert into nurse(PIN, first_name, last_name)
values ('NU0016', 'Paige', 'Wakeham');

insert into room(number_, size_)
values ('RM1', '6');
insert into room(number_, size_)
values ('RM2', '2');
insert into room(number_, size_)
values ('RM3', '3');

insert into allocation(nurse, room)
values ('NU0011', 'RM1');
insert into allocation(nurse, room)
values ('NU0012', 'RM3');
insert into allocation(nurse, room)
values ('NU0013', 'RM3');
insert into allocation(nurse, room)
values ('NU0014', 'RM3');
insert into allocation(nurse, room)
values ('NU0015', 'RM2');
insert into allocation(nurse, room)
values ('NU0016', 'RM2');

select room, (number_nurses/ro.size_) as nurses_per_room from
    (select room, count(nurse) as number_nurses
    from allocation
    group by room), room ro
where ro.number_ = room

Любая помощь Большое спасибо, спасибо.

РЕДАКТИРОВАТЬ: Попытка сделать это без операций JOIN или оператора CASE.

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Вот как я понял вопрос:

  • test CTE вычисляет количество медсестер в комнате
  • , а затем используется в подзапросе для поиска только комнат с самым высоким количество медсестер

SQL> with test as
  2    (select a.room,
  3            count(*) / r.size_ nurses_per_room
  4     from allocation a join room r on r.number_ = a.room
  5     group by a.room, r.size_
  6    )
  7  select t.room
  8  from test t
  9  where t.nurses_per_room = (Select max(t1.nurses_per_room) from test t1);

ROOM
------
RM2
RM3

SQL>
0 голосов
/ 23 марта 2020

Если я правильно понимаю, вам нужны все строки, где расчет number_nurses имеет максимальное значение. Если это так, используйте функции analyti c:

select r.*
from (select ro.number_, count(*) / ro.size_ as number_nurses,
             rank() over (order by count(*) / ro.size_) as seqnum
      from allocation a join
           room r
           on ro.number_ = a.room
      group by ro.number_, ro.size_
     ) r
where seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...