Запрос, чтобы сравнить даты пациентов, пропавших без вести в больничной переписи - PullRequest
0 голосов
/ 08 мая 2019

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

11-APR-2019 11:59:00 PM CENSUS
12-APR-2019 03:12:00 PM TRANSFER OUT
12-APR-2019 03:12:00 PM TRANSFER IN
14-APR-2019 07:06:00 AM PATIENT UPDATE
14-APR-2019 11:40:00 AM TRANSFER OUT
14-APR-2019 11:40:00 AM TRANSFER IN
14-APR-2019 11:59:00 PM CENSUS

Я создал часть календаря для моего запроса. Затем я создал запрос для захвата пациентов в сроки. оттуда я немного застрял.

DATE1
AS
(select 
to_char(dates,'MM/DD/YYYY') AS WEEK_DATE,
dates, 
to_char(dates,'D') weekday, 
to_char(dates,'mm') m_onth, 
to_char(dates,'ww') week_of_year, 
to_char(dates,'dd') month_day,
to_char(dates,'ddd') Year_day,
SUBSTR(dates,1,2) AS WEEKDATE
from (SELECT TRUNC(to_date(v.yyyy,'YYYY'),'YY') +LEVEL - 1 DATES 
FROM ( SELECT 2019 yyyy FROM dual ) v 
CONNECT BY LEVEL < 366
)
)
,
ADT 
AS (select distinct
adt.pat_id,
peh.y_mrn,
adt.DEPARTMENT_ID,
adp.department_name,
--peh.HOSP_ADMSN_TIME,
to_char(peh.HOSP_ADMSN_TIME,'MM/DD/YYYY') AS HOSP_ADMSN_TIME2,
--peh.HOSP_DISCH_TIME,
to_char(peh.HOSP_DISCH_TIME,'MM/DD/YYYY') AS HOSP_DISCH_TIME2,
adt.effective_time,
to_char(aDT.effective_time,'MM/DD/YYYY') AS EFFECT_DATE,
--LEAD(adt.effective_time) over (partition by ADT.pat_id order by ADT.pat_id, adt.effective_time) AS NEXT_EFF_DATE,
--CASE WHEN adt.event_type_c =6 THEN adt.effective_time END AS CENSUS_DATE,
et.title as event_type,
adt.event_type_c,
peh.ADT_PAT_CLASS_C,
Adt.event_subtype_c--,
--LAG(adt.effective_time) over (partition by ADT.pat_id order by ADT.pat_id, adt.effective_time) AS PREV_EFF_DATE
from 
clarity_adt adt
left OUTER join 
 pat_enc_hsp peh
 on
peh.pat_enc_csn_id = adt.pat_enc_csn_id
left outer join
clarity_dep adp 
on adt.department_id = adp.department_id
left OUTER join 
zc_event_type et 
on adt.event_type_c = et.event_type_c
where 
adt.effective_time between '08-apr-2019' and '15-apr-2019' 
order by adt.effective_time 
)
,
ADT2
AS
(
SELECT-- DISTINCT
D.WEEK_DATE,
A.HOSP_ADMSN_TIME2,
A.EFFECT_DATE,
A.PAT_ID,
CASE WHEN D.WEEK_DATE IS NOT NULL AND A.EFFECT_DATE IS NULL AND A.event_type <> 'CENSUS' THEN 1
WHEN D.WEEK_DATE IS NOT NULL AND A.EFFECT_DATE IS NULL AND A.event_type IS NULL THEN 1 
WHEN D.WEEK_DATE IS NOT NULL AND A.EFFECT_DATE IS NOT NULL AND A.event_type <> 'CENSUS' THEN 1 ELSE 0 
END AS NO_ADT_INFO,
A.event_type,
A.HOSP_DISCH_TIME2
FROM
DATE2 D
LEFT OUTER JOIN
ADT A
ON 
D.WEEK_DATE = A.EFFECT_DATE
ORDER BY 
D.WEEK_DATE)

Я хотел бы в итоге указать идентификатор пациента, день недели, когда они не проводят перепись, даты приема в больницу и выписки

PAT_ID  WEEK_DATE   EVENT_TYPE  HOSP_ADMSN_TIME HOSP_DISCH_TIME
ABCDEF  4/12/2019   NO CENSUS   4/10/2019   4/19/2019
ABCDEF  4/13/2019   NO CENSUS   4/10/2019   4/19/2019
GHIJK   4/8/2019    NO CENSUS   4/2/2019    4/12/2019
GHIJK   4/11/2019   NO CENSUS   4/2/2019    4/12/2019

1 Ответ

0 голосов
/ 08 мая 2019

Вот пример данных для двух пациентов:

  events(pat_id, event_date, event_type) as (
    select 'ABCD', to_date('2019-04-11 23:59', 'yyyy-mm-dd hh24:mi'), 'CENSUS'         from dual union all
    select 'ABCD', to_date('2019-04-12 15:12', 'yyyy-mm-dd hh24:mi'), 'TRANSFER OUT'   from dual union all
    select 'ABCD', to_date('2019-04-12 15:12', 'yyyy-mm-dd hh24:mi'), 'TRANSFER IN'    from dual union all
    select 'ABCD', to_date('2019-04-14 07:06', 'yyyy-mm-dd hh24:mi'), 'PATIENT UPDATE' from dual union all
    select 'ABCD', to_date('2019-04-14 11:40', 'yyyy-mm-dd hh24:mi'), 'TRANSFER OUT'   from dual union all
    select 'ABCD', to_date('2019-04-14 11:40', 'yyyy-mm-dd hh24:mi'), 'TRANSFER IN'    from dual union all
    select 'ABCD', to_date('2019-04-14 23:59', 'yyyy-mm-dd hh24:mi'), 'CENSUS'         from dual union all
    select 'GHIJ', to_date('2019-05-17 23:59', 'yyyy-mm-dd hh24:mi'), 'CENSUS'         from dual union all
    select 'GHIJ', to_date('2019-05-19 23:59', 'yyyy-mm-dd hh24:mi'), 'CENSUS'         from dual ),
  peh(pat_id, hosp_admsn_time, hosp_disch_time) as (
    select 'ABCD', date '2019-04-11', date '2019-04-14' from dual union all
    select 'GHIJ', date '2019-05-17', date '2019-05-20' from dual ),

Вы можете создать рекурсивный запрос, генерирующий дни для каждого пациента, и проверить, существует ли событие CENSUS для каждого из этих дней:

with cte(pat_id, num, adm, dis) as (
    select pat_id, 0, hosp_admsn_time, hosp_disch_time from peh
    union all
    select pat_id, num + 1, adm, dis from cte where num < dis - adm)
select pat_id, day, 'NO CENSUS' info, adm, dis
  from (select pat_id, adm + num day, adm, dis from cte) d
  where not exists (
    select 1 
      from events 
      where pat_id = d.pat_id and trunc(event_date) = d.day and event_type = 'CENSUS')
  order by pat_id, day;

Результат:

PAT_ID DAY         INFO      ADM         DIS
------ ----------- --------- ----------- -----------
ABCD   2019-04-12  NO CENSUS 2019-04-11  2019-04-14
ABCD   2019-04-13  NO CENSUS 2019-04-11  2019-04-14
GHIJ   2019-05-18  NO CENSUS 2019-05-17  2019-05-20
GHIJ   2019-05-20  NO CENSUS 2019-05-17  2019-05-20

Демоверсия dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...