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
需要显示入住技能护理机构、出院回家(有或没有护理)以及住进医院或急诊室的患者经过的天数。
我被要求显示入院、出院(有或没有护理)并入院或急诊室的患者经过的天数。该指标旨在评估熟练护理机构防止患者在离开护理机构后再次入院或在急诊室就诊的能力的有效性。
我有一个更大的查询,使用 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