Первый шаг заключается в выборе критических пациентов и заказать их:
select id, patient, row_number() over (partition by id order by patient) as rnk
from your_table
where status='critical';
После этого вы можете выбрать первые два критических пациентов таким образом:
select id,
max(case when rnk=1 then patient end) as Patient1,
max(case when rnk=2 then patient end) as Patient2
from (
select id,
patient,
row_number() over (partition by id order by patient) as rnk
from your_table
where status='critical'
)
group by id;
Если вы хотите получить более гибкое решение вы можете попробовать такой запрос, как показано ниже, но вы должны выбрать количество рангов до времени выполнения:
with your_table as
(select 1 as id, 'critical' as status, 'Gabriel' as patient from dual
union all
select 1, 'moderate', 'Frank' from dual union all
select 1, 'critical', 'Dorin' from dual union all
select 1, 'critical', 'Vasile' from dual union all
select 2, 'low', 'Peter' from dual union all
select 3, 'critical', 'Noman' from dual union all
select 3, 'moderate', 'Johnson' from dual)
select * from (
select id, patient, row_number() over (partition by id order by patient) as rnk
from your_table
where status='critical'
)
pivot (max(patient) for rnk in (1, 2, 3))
order by 1 ;
(Это для трех пациентов.)
Что произойдет, если у вас есть 3 критических пациентов с одинаковыми идентификаторами? –
@AmitSingh Я думаю, что вы не прочитали вопрос и ожидаемый результат .. :) – BreakHead
вы правы, я понял это сейчас –