2016-11-03 5 views
0

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

Врач уходит на пенсию. Ее пациенты должны быть уведомлены о ее выходе на пенсию. Люди, которые составляют «ее пациент», видели ее больше времени, чем любой другой врач за последние два года. В противном случае (т. Е. Видел ее и другого врача по 2 раза в течение последних 2 лет), они «терпеливы», если они отправились к ней совсем недавно.

Вот что у меня есть, до сих пор.

select patient_id, last_name, first_name, post_fromdate, performing_md_id, performing_md_name, category_desc, procedure_code 
from [table] 
where post_fromdate >= ADD_MONTHS(SYSDATE,-24) 
and category_desc like '%WELL%' --specific visit type 
and patient id in ([list of patients]) 
group by patient_id, last_name, first_name, post_fromdate, performing_md_id, performing_md_name, category_desc, procedure_code 
order by patient_id, post_fromdate desc 

Резюмируя ...

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

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

Любая помощь любезно принята. Заранее спасибо.

EDIT: желаемый результат будет выводиться, что дает мне информацию в предложении select, с одним и только одним perform_md_id на patient_id, указывающим, что врач пациента (врач, которого они видели чаще всего за последние два года. не то, то доктор, которого они видели совсем недавно).

+0

Опубликуйте свою схему, некоторые данные образца и желаемый результат. –

+0

Вам нужно будет иметь счет (посещений) в схеме запроса-сообщения вовлеченных таблиц. – donlys

+0

Вот катастрофа: все это в одном столе. Эта система БД полностью переделана. Даже пожизненные люди не знают, где находится какая-либо информация. – sleddog

ответ

0

Я собираюсь предположить, что у вас есть таблица в форме пациента, документ, дата визита

select patient,[This Doc] as [This DOC Visit Count], [Other Doc] as [Other Doc Visit Count] 
into #visit_counts 
from (select patient, case when doctor = 'retiring doc' then 'This Doc' else 'Other Doc' end as Doc, visit_date from doc_patient_visit_table) P 
Pivot (count(visit_date) for Doc in ([This Doc],[Other Doc])) Pvt 

select patient,[This Doc] as [This DOC Last Visit], [Other Doc] as [Other Doc Last visit] 
into #visit_times 
from (select patient, case when doctor = 'retiring doc' then 'This Doc' else 'Other Doc' end as Doc, visit_date from doc_patient_visit_table) P 
Pivot (max(visit_date) for Doc in ([This Doc],[Other Doc])) Pvt 

select patient, [This DOC Visit Count], [Other Doc Visit Count], [This DOC Last Visit], [Other Doc Last visit] 
from #visit_counts t1 
join #visit_times t2 on t1.patient = t2.patient 
where [This DOC Visit Count] > [Other Doc Visit Count] or ([This DOC Visit Count] = [Other Doc Visit Count] and [This DOC Last Visit] > [Other Doc Last visit]) 

Другой метод

Select patient, 
sum(case when doc = 'retiring_doc' then 1 else 0 end) as [This DOC Visit Count], 
max(case when doc = 'retiring_doc' then visit_date end) as [This DOC Last Visit], 
sum(case when doc != 'retiring_doc' then 1 else 0 end) as [Other Doc Visit Count], 
max(case when doc != 'retiring_doc' then visit_date end) as [Other Doc Last visit] 
from from doc_patient_visit_table 
group by patient 
having sum(case when doc = 'retiring_doc' then 1 else 0 end) > sum(case when doc != 'retiring_doc' then 1 else 0 end) 
OR (sum(case when doc = 'retiring_doc' then 1 else 0 end) = sum(case when doc != 'retiring_doc' then 1 else 0 end) 
AND [This DOC Last Visit] > [Other Doc Last visit]) 
+0

Это имеет смысл. Я дам ему попытку колледжа. Спасибо за ваш вклад! – sleddog

1

Что-то вроде этого. Имена таблиц и столбцов составлены, но должны быть понятными.

select patient_id, 
     max(doctor_id) keep (dense_rank last order by ct, last_visit) as primary_doctor_id 
from (
     select patient_id, doctor_id, count(*) as ct, max(visit_date) as last_visit 
     from  visits 
     group by patient_id, doctor_id 
     ) 
group by patient_id 
;