Inner Abfrage den ersten Besuch für jede Person identifiziert, schließt sich dann, dass an den Personen Besuch im Krankenhaus.
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;
Allerdings könnten Sie wahrscheinlich Ihr Design, indem sie alle Ihre Besuche in einer Tabelle straffen und mit einer zusätzlichen Spalte die Besuchsart anzuzeigen.
-Code nach neuen Anforderungen zur Verfügung gestellt:
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;
ich einige neue Beispieldaten. Bob hatte zwei Krankenhausbesuche und drei neue Nachuntersuchungen.
Angel hatte einen Follow-up-Besuch vor dem Krankenhausbesuch sowie danach.
Tyler hatte einen Follow-up-Besuch vor dem Krankenhaus besuchen:
Ergebnisse:
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
Hinweis: seit Besuchszeit ein FU Besuch am selben Tag nicht enthalten ist, als ein Krankenhaus Besuch gezählt nach dem Krankenhausbesuch. Sie können die Besuchsbedingung von AND hv.VisitDate < = fuv.VisitDate in AND hv.VisitDate ändern < fuv.VisitDate, wenn das nicht korrekt ist.
Ich hoffe, Sie haben etwas Besseres als Name, um mitzumachen.Wie gehen Sie mit Situationen um, in denen zwei Personen den gleichen Namen haben? Um das Problem zu lösen, denke ich, dass Sie über Joins nachlesen müssen. Das klingt sehr nach einer einfachen Linke zu mir. http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ –
OK, damit Sie bei PatientenID beitreten. Dies klingt immer noch wie ein einfacher linker Join. Siehe den Artikel, den ich verlinkt habe. –
Ich verwendete Namen als Beispiel, in dem Datensatz, den ich erhielt, erhält jeder Name eine eindeutige Patienten-ID. Ich verwendete die eindeutigen IDs, um meinen tatsächlichen Code beizutreten, aber ich änderte es hier, um meinem Beispiel zu entsprechen. Ein einfacher linker Join hört sich vernünftig an, da er Werten ohne Follow-up-Datum einen NULL-Wert geben würde. NULL würde 0 anzeigen. Mein einziges Follow-Up ist dann, wie ich über die Konvertierung in Tage gehen würde. Zum Beispiel habe ich das Datum in [2014] - [09] - [05] unterteilt, wobei jeder Wert eine eigene Variable hat. in einem Fall von [2014] - [10] - [05] - [2014] - [09] - [04] = 1 Monat, 1 Tag, wie würde ich das nur in Tage umwandeln? –