SQL server bekommt den letzten Wert in Tabelle x vor date für nicht verschiedene Zeilen in Tabelle y

Ich versuche, die letzte PatientData.DateVal und PatientData.DecVal vor PatientTreatment.Startdate zu PatientTreatment . PatientData.DecVal PatientTreatment.Startdate für jede Zeile in PatientTreatment . ZB möchte ich das letzte date und den Wert für eine bestimmte Art von Patientendaten vor jeder Behandlung für jeden Patienten.

Ich habe das Skript unten verwendet. Es funktioniert ok Aber dieses Skript ist nicht gut für mich, weil es mir eine list gibt, die nur einmal einen Patienten auflistet. Ich möchte den neuesten Wert für jede Behandlung bekommen.

 SELECT PatientTreatment.PatientId ,PatientTreatment.StartDate ,PatientData.FK_PatientId ,PatientData.DateVal ,PatientData.DecVal FROM PatientTreatment ,PatientData WHERE PatientTreatment.PatientId = PatientData.FK_PatientId AND PatientData.FK_ParamSettingId = 68 AND PatientData.DateVal = ( SELECT MAX(DateVal) FROM PatientData WHERE PatientData.FK_PatientId = PatientTreatment.PatientId AND DateVal < PatientTreatment.StartDate ) 

Meine Tabelle PatientData hat die folgenden Spalten (vereinfacht):

 --------------------------------------------------------------- | Id | FK_PatientID | FK_ParamsettingId | DateVal | DecVal | --------------------------------------------------------------- | 1 | 247 | 69 | 2010-09-11 | 1 | | 2 | 514 | 68 | 2011-11-21 | 0 | | 3 | 20291 | 69 | 2012-11-21 | 2.4 | | 4 | 20291 | 69 | 2013-12-21 | 3 | | 5 | 20291 | 69 | 2011-03-03 | 0 | | 6 | 20221 | 68 | 2012-03-04 | 3 | | 7 | 20291 | 68 | 2011-06-06 | 2 | | 10 | 234 | 69 | 2011-03-07 | 4 | | 11 | 444 | 69 | 2012-04-05 | 1.1 | | 12 | 212 | 69 | 2012-12-04 | 4.2 | | 13 | 21342 | 69 | 2011-11-03 | 5.5 | | 14 | 223 | 69 | 2013-11-01 | 3.3 | --------------------------------------------------------------- 

Und meine Tabelle PatientTreatment hat die folgenden Spalten (vereinfacht):

 -------------------------- | PatientID | StartDate | -------------------------- | 247 | 2010-09-11 | | 514 | 2011-11-21 | | 20291 | 2012-11-21 | | 201 | 2013-12-21 | | 2291 | 2011-03-03 | | 221 | 2012-03-04 | | 20291 | 2011-06-06 | | 234 | 2011-03-07 | | 80998 | 2012-04-05 | | 212 | 2012-12-04 | | 21342 | 2011-11-03 | | 223 | 2013-11-01 | -------------------------- 

Ich hoffe ihr könnt mir helfen.

Mit freundlichen Grüßen Doggabyte

EDIT: Ich möchte eine Ausgabe, die die folgenden Spalten enthält: PatientId, Startdate, LastDateValBeforeStartdate, LastDecValBeforeStartdate

Hier können Sie windowsfunktionen nutzen:

 select x.PatentId, x.StartDate, x.DateVal, x.DecVal from ( select t.PatientId, t.StartDate, p.DateVal, p.DecVal, row_number() over ( partition by t.patientid, t.StartDate order by p.DateVal Desc ) rn from PatientTreatment t inner join PatientData p on t.PatientId = p.FK_PatientId where p.FK_ParamSettingId = 68 And t.StartDate > p.DateVal ) x where x.rn = 1 

Ähnlich wie das windows oben Beispiel aber mit einem CTE:

 ;WITH OrderedPatientData AS ( SELECT PatientID, StartDate, DateVal AS LastDateValBeforeStartdate, DecVal AS LastDecValBeforeStartdata, ROW_NUMBER() OVER (Partition BY PatientID ORDER BY DateVal DESC) RowNum FROM PatientData PD INNER JOIN PatientTreatment PT ON PT.PatientID = PD.FK_PatientID AND PD.DateVal < PT.StartDate WHERE PD.FK_ParamSettingId = 68 ) SELECT PatientID, StartDate, LastDateValBeforeStartdate, LastDecValBeforeStartdata FROM OrderedPatientData OPD WHERE RowNum = 1 

Vielleicht so etwas

 SELECT PatientTreatment.PatientId ,PatientTreatment.StartDate ,x.FK_PatientId ,x.DateVal ,x.DecVal FROM PatientTreatment JOIN ( SELECT MAX(DateVal) ,PatientID,FK_PatientId,FK_ParamsettingId FROM PatientData GROUP BY PatientID )x ON PatientTreatment.PatientId = x.FK_PatientId WHERE x.FK_ParamSettingId = 68 AND x.DateVal < PatientTreatment.StartDat