Существуют более элегантные способы сделать это с помощью CTE, но это простое решение.
Сначала я скопировал ваш образец данных и вставил в табличную переменную @t
. Затем все, что мы делаем, это группируем по recordid, получая минимальную дату создания и максимальную дату обновления (игнорируя статус на данный момент). Мы присоединяемся к этому подзапросу и возвращаемся к вашей исходной таблице, объединяя запись и дату обновления, это даст нам последнюю запись для идентификатора записи и оттуда получит статус.
DECLARE @t TABLE ([Record ID] int, [Create Date] date, [Update Date] date, [Record Status] varchar(20))
INSERT INTO @t VALUES
(123, '2018-05-01', '2018-05-01', 'Active'),
(123, '2018-05-08', '2018-05-08', 'Active'),
(123, '2018-05-15', '2018-05-15', 'Closed'),
(123, '2018-05-22', '2018-05-22', 'Closed'),
(456, '2018-06-02', '2018-06-02', 'Pending'),
(456, '2018-06-09', '2018-06-09', 'Active'),
(456, '2018-06-16', '2018-06-16', 'Active'),
(456, '2018-06-23', '2018-06-23', 'Suspended')
SELECT
g.[Record ID], g.[Create Date], g.[Update Date], t.[Record Status]
FROM
(
SELECT [Record ID], MIN([Create Date]) AS [Create Date], MAX([Update Date]) AS [Update Date]
FROM @t
GROUP BY [Record ID]
) g
JOIN @t t ON g.[Record ID] = t.[Record ID] and g.[Update Date] = t.[Update Date]
ORDER BY [Record ID]
Вот ссылка на SQL-скрипту, которая показывает результаты. Единственное отличие этой версии - это название таблицы.
http://sqlfiddle.com/#!18/0bb22/1/0
ОБНОВЛЕНИЕ На основе вашего запроса к набору данных
Это не может быть 100%, так как у меня нет всех ваших данных для тестирования, но вам, вероятно, просто нужно следующее.
SELECT
g.RECORD_ID, g.RECORD_CREATED_DATE, g.lastUpdateDate, t.RECORD_STATUS_CODE
FROM
(
SELECT RECORD_ID, MIN(RECORD_CREATED_DATE) AS RECORD_CREATED_DATE, MAX(RECORD_UPDATED_DATE) AS lastUpdateDate
FROM DB.RECORD
GROUP BY RECORD_ID
) g
JOIN DB.RECORD t ON g.RECORD_ID = t.RECORD_ID and g.lastUpdateDate = t.RECORD_UPDATED_DATE
ORDER BY RECORD_ID