Есть ли причина, по которой вам нужно, чтобы строки отображались для пациента / служб, если у них нет статуса для этой службы? Похоже, что это должно быть что-то обработано на переднем конце для меня.
Тем не менее, чтобы получить то, что вы ищете, я бы, вероятно, использовал следующее:
SELECT
P.Code,
S.pkServiceID, --Ugh, I hate that naming convention
PS.fkPatientID,
PS.fkStatusID,
S.Code AS ServiceCode,
S.Description AS ServiceDescription,
ST.Code AS StatusCode,
ST.Description AS StatusDescription
PS.TsStart
FROM
Patient P
CROSS JOIN Service S
LEFT OUTER JOIN PatientStatus PS ON
PS.fkPatientID = P.pkPatientID AND
PS.fkServiceID = S.pkServiceID
LEFT OUTER JOIN PatientStatusPS2 ON
PS2.fkPatientID = P.pkPatientID AND
PS2.fkServiceID = S.pkServiceID AND
PS2.TsStart > PS.TsStart
LEFT OUTER JOIN Status ST ON
ST.pkStatusID = PS.fkStatusID
WHERE
PS2.fkPatientID IS NULL
Просто короткое замечание ... если у вас два статуса с одинаковым TsStart для одного и того же пациента и службы, вы получите здесь дубликаты. Вы также получите их из исходного запроса. Вы можете написать код, если это необходимо. Просто измените последнюю строку в соединении на PS2 на:
(PS2.TsStart > PS.TsStart OR (PS2.TsStart = PS.TsStart AND PS2.pkID > PS.pkID))