內部查詢識別每個人的第一次訪問,然後加入該到的人到醫院就診。
USE tempdb;
CREATE TABLE dbo.HospitalVisit (Name VARCHAR(10), Code1 INT, VisitDate DATE);
CREATE TABLE dbo.FollowUpVisit (Name VARCHAR(10), Code1 INT, VisitDate DATE);
INSERT INTO dbo.HospitalVisit
(Name ,
Code1 ,
VisitDate
)
VALUES ('Chris',85,'20140905'),
('Bob',85,'20140905'),
('Angel',85,'20140905'),
('Tyler',85,'20140905'),
('Rick',85,'20140905');
INSERT INTO dbo.FollowUpVisit
(Name ,
Code1 ,
VisitDate
)
VALUES ('Chris',83,'20140915'),
('Chris',83,'20141015'),
('Chris',83,'20141018'),
('Bob',83,'20140910'),
('Angel',83,'20141006');
SELECT hv.Name,
HospitalVisitDate = hv.VisitDate,
Flag = CASE
WHEN DATEDIFF(DAY, hv.VisitDate, FUV.FirstVisit) < 7 THEN
1
ELSE
0
END,
FUV.FirstVisit,
DaystoFirstVisit = DATEDIFF(DAY, hv.VisitDate, FUV.FirstVisit)
FROM dbo.HospitalVisit AS hv
LEFT JOIN
(SELECT FUV.Name,
FirstVisit = MIN(FUV.VisitDate)
FROM dbo.FollowUpVisit AS FUV
GROUP BY FUV.Name
) AS FUV
ON hv.Name = FUV.Name;
然而,你也許可以通過將在一個表中的所有的訪問和使用附加列指示訪問類型的簡化設計。之後提供了新的要求
代碼:
USE tempdb;
IF OBJECT_ID('tempdb..HospitalVisit') IS NOT NULL
DROP TABLE dbo.HospitalVisit;
GO
IF OBJECT_ID('tempdb..FollowUpVisit') IS NOT NULL
DROP TABLE dbo.FollowUpVisit;
GO
CREATE TABLE dbo.HospitalVisit (Name VARCHAR(10),Code1 INT,VisitDate DATE);
CREATE TABLE dbo.FollowUpVisit (Name VARCHAR(10),Code1 INT,VisitDate DATE);
INSERT INTO dbo.HospitalVisit (Name,Code1,VisitDate)
VALUES ('Chris', 85, '20140905'),
('Bob', 85, '20140905'),
('Bob', 85, '20141005'),
('Angel', 85, '20140905'),
('Tyler', 85, '20140905'),
('Rick', 85, '20140905');
INSERT INTO dbo.FollowUpVisit (Name,Code1,VisitDate)
VALUES ('Chris', 83, '20140915'),
('Chris', 83, '20141015'),
('Chris', 83, '20141018'),
('Bob', 83, '20140920'),
('Bob', 83, '20140910'),
('Bob', 83, '20141010'),
('Bob', 83, '20141020'),
('Angel', 83, '20140901'),
('Tyler', 85, '20140904'),
('Angel', 83, '20141006');
WITH cte
AS (SELECT hv.Name,
HospitalCode = hv.Code1,
HospitalVisit = hv.VisitDate,
FUCode = fuv.Code1,
FirstFollowUpVisit = fuv.VisitDate,
FUSeq = ROW_NUMBER() OVER (PARTITION BY hv.Name, hv.VisitDate ORDER BY fuv.VisitDate),
DaystoFirstFollowUp = DATEDIFF(DAY,hv.VisitDate, fuv.VisitDate)
FROM dbo.HospitalVisit AS hv
LEFT JOIN dbo.FollowUpVisit AS fuv
ON hv.Name = fuv.Name
AND hv.VisitDate <= fuv.VisitDate
)
SELECT cte.Name ,
cte.HospitalCode ,
cte.HospitalVisit ,
cte.FUCode ,
cte.FirstFollowUpVisit ,
cte.DaystoFirstFollowUp
FROM cte
WHERE cte.FUSeq = 1;
我增加了一些新的樣本數據。 鮑勃有兩次醫院就診和三次新的隨訪。
天使在醫院訪視前以及隨後的訪問之前進行了隨訪。
泰勒不得不之前醫院就診後續訪問:
結果:
Name HospitalCode HospitalVisit FUCode FirstFollowUpVisit DaystoFirstFollowUp
Angel 85 2014-09-05 83 2014-10-06 31
Bob 85 2014-09-05 83 2014-09-10 5
Bob 85 2014-10-05 83 2014-10-10 5
Chris 85 2014-09-05 83 2014-09-15 10
Rick 85 2014-09-05 NULL NULL NULL
Tyler 85 2014-09-05 NULL NULL NULL
注:因爲不包括訪問時間,在同一天,FU訪問作爲醫院的訪問是被視爲在醫院訪視後發生。您可以將訪問條件從AND hv.VisitDate < = fuv.VisitDate更改爲AND hv.VisitDate < fuv.VisitDate(如果不正確)。
我希望你有更好的名字加入。你如何處理兩個人有相同名字的情況?爲了回答手頭的問題,我認爲你需要閱讀關於連接的內容。這聽起來很像我的一個基本的左連接。 http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ –
好吧,你會加入PatientID。這聽起來像是一個基本的左連接。看到我鏈接的文章。 –
我用名稱作爲例子,在我給出的數據集中,每個名稱都有一個唯一的患者ID。我使用了唯一的ID來加入我的實際代碼,但我在這裏更改了它以匹配我的示例。一個基本的左連接聽起來是合理的,因爲它會給沒有後續日期的值賦予NULL值,NULL會指示爲0.然後,我唯一的後續操作就是我將如何轉換爲日期。例如,我已將日期分解爲[2014] - [09] - [05],其中每個值都有自己的變量。在[2014] - [10] - [05] - [2014] - [09] - [04] = 1個月,1天的情況下爲 ,我將如何將其轉換爲幾天? –