SQL 显示3个条件匹配数据的代码

SQL Code to display data matching on 3 conditions

需要显示入住技能护理机构、出院回家(有或没有护理)以及住进医院或急诊室的患者经过的天数。

我被要求显示入院、出院(有或没有护理)并入院或急诊室的患者经过的天数。该指标旨在评估熟练护理机构防止患者在离开护理机构后再次入院或在急诊室就诊的能力的有效性。

我有一个更大的查询,使用 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 table

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                                 

Here is the expected output

我能够 re-constitute 那 sql,然后用 prettyprint 来查看它。 试试这个,看看它是否更简单。在 CTE 中执行所有 OVER 一次...您可能想要删除 ISNULL(CAST(... 并接受结果为 0(零)。

修改后的 5 月 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