我有2个数据集的表,一个数据集有医生办公室数据,另一个数据集有医院数据。 因此,我试图找出的是,患者在初次入院90天后是否随访了他的医生。 患者可以有多个入院日期,如果他们在 90 天后随访医生,我们会分别查看每个入院日期。 计算应该是
if service_date - discharge_Date > 90 then flag as 1
SET NOCOUNT ON
GO
DECLARE @TEST TABLE
(
[NAME] VARCHAR(15)
,[SERVICE_DT] DATETIME
,[DSCH_DT] DATETIME
,[SRC] VARCHAR(50)
,[LOC] VARCHAR(50)
)
INSERT INTO @TEST ([NAME], [SERVICE_DT], [DSCH_DT], [SRC], [LOC])
VALUES ('MIKE', '2014-01-01', '2014-01-01', 'Hospital', 'NY')
,('MIKE', '2014-2-27', '2014-02-28', 'Hospital', 'NY')
,('MIKE', '2014-07-15', '2014-07-15', 'Hospital', 'NY')
,('DAVID', '2014-09-04', '2014-09-04', 'Hospital', 'NY')
,('DAVID', '2014-04-01', '2014-04-02', 'Hospital', 'NY')
,('TOM', '2014-05-01', '2014-08-15', 'Hospital', 'TX')
,('MIKE', '2014-03-02', '9999-01-01', 'Doctor_Offfice', 'NY' )
,('MIKE', '2014-05-22', '9999-01-01', 'Doctor_Offfice', 'NY' )
,('DAVID', '2014-01-01', '9999-01-01', 'Doctor_Offfice', 'NY')
,('DAVID', '2014-05-03', '9999-01-01', 'Doctor_Offfice', 'NY')
,('TOM', '2014-08-20', '9999-01-01', 'Doctor_Offfice', 'TX')
,('DAVID', '2014-12-02', '9999-01-01', 'Doctor_Offfice', 'NY')
;WITH MYTEST ([NAME], [SERVICE_DT], [DSCH_DT], [SRC], [LOC]) AS
(
SELECT NAME
,[SERVICE_DT]
,[DSCH_DT]
,[SRC]
,LOC
FROM @TEST
)
,HOSP AS
(
SELECT NAME
--,[SERVICE_DT]
,[DSCH_DT]
,[LOC] FROM MYTEST
WHERE SRC = 'Hospital'
)
,DOC AS
(
SELECT NAME
,[SERVICE_DT]
--,[DSCH_DT]
,[SRC] FROM MYTEST
WHERE SRC = 'Doctor_Offfice'
)
SELECT HOSP.NAME, HOSP.DSCH_DT, DOC.SERVICE_DT, HOSP.LOC AS HOSP_SRC, DOC.SRC AS DOC_SRC, CASE
WHEN HOSP.DSCH_DT < DateAdd(d, 90, DOC.SERVICE_DT) THEN 1 ELSE 0 END AS FU90 FROM HOSP INNER
JOIN DOC ON HOSP.NAME = DOC.NAME
SET NOCOUNT OFF
GO
原始小提琴很接近。
这在技术上满足所有提供的要求,但与您想要的结果不匹配。
因此,要么要求不正确(或缺少一些(,要么您的预期结果不正确。
具体来说,我不确定如何解释两次医院就诊和一次医生就诊在 90 天内......
这是做什么的:
- 它将数据分成两组。一个用于医生办公室,一个用于医院。(你用 CTE 很好(
- 然后,它根据患者姓名加入这些集合,并在出院后 90 天内进行医生访问。
- 然后,它会评估 dr.Location 是否为空(实际上可以评估任何值(,但如果是,tat 意味着由于左关节他的作品,他们没有跟进。
.
SELECT H.name, H.service_Dt, H.DSCH_DT, H.src, H.loc,
CASE WHEN DR.LOC is not null then 1 else 0 end as FollowUp90
FROM test H
LEFT JOIN (SELECT name, service_Dt, DSCH_DT, src, loc
FROM TEST
WHERE SRC = 'Doctor_Offfice') DR
ON DR.Name = H.Name
and DR.Service_DT between H.DSCH_DT and DATEADD(DAY, 90, H.DSCH_DT)
WHERE H.Src = 'Hospital'
GROUP BY H.name, H.service_Dt, H.DSCH_DT, H.src, H.loc,
CASE WHEN DR.LOC is not null then 1 else 0 end
Order by H.Name, H.Service_DT
我将在没有进一步的需求定义或解释为什么您的预期结果是这样的的情况下尽可能接近。 它们不符合您声明的要求。
--- 接受后编辑:要考虑第一次出现,我们只需要在子选择上最小化服务日期并添加一个组依据。
但是,如果有人在同一天跟进了两个不同的医生,这仍然会导致找到两个条目。
SELECT H.name, H.service_Dt, H.DSCH_DT, H.src, H.loc,
CASE WHEN DR.LOC is not null then 1 else 0 end as FollowUp90
FROM test H
LEFT JOIN (SELECT name, min(service_Dt) Service_DT, loc, src
FROM TEST
WHERE SRC = 'Doctor_Offfice'
GROUP BY name, loc,src ) DR
ON DR.Name = H.Name
and DR.Service_DT between H.DSCH_DT and DATEADD(DAY, 90, H.DSCH_DT)
WHERE H.Src = 'Hospital'
GROUP BY H.name, H.service_Dt, H.DSCH_DT, H.src, H.loc,
CASE WHEN DR.LOC is not null then 1 else 0 end
Order by H.Name, H.Service_DT
更新的小提琴