Код SQL для отображения соответствия данных в 3 условиях - PullRequest
0 голосов
/ 08 мая 2019

Необходимо отобразить количество дней, прошедших с тех пациентов, которые были госпитализированы в специализированное учреждение по уходу за больными, выписаны в свои дома (с уходом или без него) и были помещены в больницу или отделение неотложной помощи.

Меня попросили показать количество дней, прошедших с тех пациентов, которые были помещены в лечебное учреждение для умений, выписаны в свои дома (с уходом или без него) и были помещены в больницу или отделение неотложной помощи.Метрика предназначена для оценки эффективности способности квалифицированных медицинских учреждений не допустить повторного госпитализации пациентов в больницы или наблюдения в отделении неотложной помощи после ухода из медицинского учреждения.

У меня есть намного больший запрос, который отлично работает, используя FOLLOWING и PRECEDING, который дает мне предыдущую возможность и следующую допущенную возможность, но это не помогает с проблемой выше.Я знаю необходимость еще одного подзапроса, но тот, который я только что выделил, самый последний и самый ранний.Мне нужно, чтобы он катался и искал первый экземпляр, который соответствует условию.Меня попросили либо указать дни, либо указать дату последнего приема.

select nursing.*, hospital.*
from
(Select--nursing stays only
SUMMARY.MEMBER_ID
, SUMMARY.POS
, SUMMARY.ADMIT_DATE
, SUMMARY.DISCHARGE_DATE
, SUMMARY.Discharge_To

FROM PRD.SUMMARY

INNER JOIN

(Select 
SUMMARY.MEMBER_ID, MAX(DISCHARGE_DATE) MX_DISCHARGE_DATE

FROM PRD.SUMMARY
WHERE

SUMMARY.DISCHARGE_DATE BETWEEN '2017-01-01' AND '2018-12-31'
  And SUMMARY.POS = 'Nursing' 
group by SUMMARY.MEMBER_ID) sq 

ON sq.MEMBER_ID = SUMMARY.MEMBER_ID and sq.MX_DISCHARGE_DATE = SUMMARY.DISCHARGE_DATE
WHERE

SUMMARY.DISCHARGE_DATE BETWEEN '2017-01-01' AND '2018-12-31'
  And SUMMARY.POS = 'Nursing') nursing 

INNER JOIN

( --hospital stays only
Select
SUMMARY.MEMBER_ID
, SUMMARY.POS
, SUMMARY.ADMIT_DATE
, SUMMARY.DISCHARGE_DATE
, SUMMARY.Discharge_To

FROM PRD.SUMMARY

INNER JOIN (

select MEMBER_ID, MIN(ADMIT_DATE) MIN_ADMIT_DATE

FROM PRD.SUMMARY

WHERE
SUMMARY.DISCHARGE_DATE BETWEEN '2017-01-01' AND '2018-12-31' And SUMMARY.POS = 'Hospital'

GROUP BY SUMMARY.MEMBER_ID) sq 

on sq.MEMBER_ID = SUMMARY.MEMBER_ID and sq.MIN_ADMIT_DATE = SUMMARY.ADMIT_DATE

WHERE
SUMMARY.DISCHARGE_DATE BETWEEN '2017-01-01' AND '2018-12-31' And SUMMARY.POS = 'Hospital')

hospital on nursing.MEMBER_ID = hospital.MEMBER_ID and nursing.DISCHARGE_DATE >= hospital.ADMIT_DATE

DDL для создания вышеприведенной таблицы

CREATE TABLE [dbo].[jpsSUMMARY](
    [member_id] [int] NULL,
    [pos] [nvarchar](10) NULL,
    [admit_date] [date] NULL,
    [discharge_date] [date] NULL,
    [discharge_to] [nvarchar](50) NULL
)
GO

CSV-данные, соответствующие ожидаемому результату

member_id,pos,admit_date,discharge_date,discharge_to
1001,Nursing   ,2016-03-08,2016-03-14,Home Without Care                                 
1001,Hospital  ,2016-03-21,2016-03-24,Home Without Care                                 
1001,ER        ,2016-03-27,2016-03-28,Hospital                                          
1001,Nursing   ,2016-08-19,2016-09-02,Home Without Care                                 
1001,ER        ,2016-09-05,2016-09-06,Home Without Care                                 

Вот ожидаемый результат

1 Ответ

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

Мне удалось воссоздать этот sql, а затем довольно распечатать его. Попробуйте это, чтобы увидеть, если это немного проще. Сделайте все ПЕРЕХОДЫ один раз в CTE ... Вы можете удалить ISNULL (CAST (... и принять результаты как 0 (ноль).

пересмотренный май10 полдень pos -> [pos]

WITH  SumRN as
(SELECT 
       member_id
      ,[pos]
      ,admit_date
      ,discharge_date
      ,discharge_to
      ,ROW_NUMBER() Over (Partition By member_id order by discharge_date, admit_date) as rn
  FROM PRD.SUMMARY  --jpsSUMMARY
 )

SELECT
     s1.member_id
    ,s1.[pos]
    ,s1.admit_date
    ,s1.discharge_date
    ,s1.discharge_to
    ,ISNULL(sp.[pos],'') as Previous
    ,ISNULL(sf.[pos],'') as Next

    ,ISNULL(cast(case when sp.[pos] = 'Nursing' and sp.discharge_to Like 'Home%' and s1.[pos] = 'Hospital'  
           Then Datediff(d, sp.discharge_date, s1.admit_date) Else null End  as varchar(10)), '') as DaysNursingHosp
    ,ISNULL(cast(case when sp.[pos] = 'Nursing' and sp.discharge_to Like 'Home%' and s1.[pos] = 'ER'        
           Then Datediff(d, sp.discharge_date, s1.admit_date) Else null End  as varchar(10)), '') as DaysNursingER
 From          SumRN s1
 Left Join     SumRN sp
                  on s1.RN - 1 = sp.RN 
 Left Join     SumRn sf
                  on s1.RN + 1 = sf.RN

Результаты -

member_id   pos admit_date  discharge_date  discharge_to        Previous    Next    DaysN2Hosp  DaysN2ER
1001    Nursing     2016-03-08  2016-03-14  Home Without Care               Hospital        
1001    Hospital    2016-03-21  2016-03-24  Home Without Care   Nursing     ER          7   
1001    ER          2016-03-27  2016-03-28  Hospital            Hospital    Nursing         
1001    Nursing     2016-08-19  2016-09-02  Home Without Care   ER          ER              
1001    ER          2016-09-05  2016-09-06  Home Without Care   Nursing                          3
...