MadMyche
Основываясь на вашем исходном содержании, я создал следующую таблицу и заполнил ее. Обратите внимание, что различия в названиях столбцов: это связано с тем, что оба Status
и Location
выделяются ли специальные/зарезервированные слова в SQL Server и me editor (SSMS)
CREATE TABLE TestData (
PatientID int,
ApptDate date,
ApptStatus varchar(32),
VisitType varchar(32),
VisitTime time,
Facility varchar(32)
)
GO
INSERT TestData VALUES
(101, '01/01/2001', 'Complete', 'Flu complaint', '08:00', 'TeleMed')
, (101, '01/11/2001', 'Complete', 'Blood draw', '11:30', 'Outpatient Lab')
, (500, '05/01/2005', 'Complete', 'Broken Leg', '08:00', 'ER')
, (500, '06/01/2005', 'Complete', 'XRays', '17:00', 'Radiology')
, (600, '06/06/2005', 'Complete', 'Medical Complaint', '09:00', 'ER')
GO
Способ, которым я собираюсь написать это, будет включать использование 3 переменных в среде SQL. Первый (@PatientID) будет использоваться для определения того, о каком пациенте вы хотите получить данные; а два других (@FirstDate, @LastDate) будут использоваться для определения даты первого и последнего приема.
DECLARE @PatientID INT = 500
DECLARE @FirstDate DATE
DECLARE @LastDate DATE
SELECT @FirstDate = Min(ApptDate), @LastDate = Max(ApptDate)
FROM TestData
WHERE (PatientID = @PatientID)
Теперь, когда у нас есть все эти значения, нам не нужно использовать подзапросы, и это просто становится вопросом использования этих переменных в рамках
JOIN
оператор для выравнивания результатов в одну строку
SELECT f.PatientID
, FirstApptDate = f.ApptDate
, FirstApptStatus = f.ApptStatus
, FirstApptType = f.VisitType
, LastApptDate = l.ApptDate
, LastApptStatus = l.ApptStatus
, LastApptType = l.VisitType
FROM TestData f
INNER JOIN TestData l ON f.PatientID = l.PatientID
AND f.ApptDate = @FirstDate
AND l.ApptDate = @LastDate
WHERE (f.PatientID = @PatientID)