Это довольно старая тема, но я подумал, что я бы скинул свои два цента точно так же, как принятый ответ не работал для меня особенно хорошо.Я попробовал решение gbn для большого набора данных и обнаружил, что оно ужасно медленное (> 45 секунд на 5 миллионов записей в SQL Server 2012).Глядя на план выполнения, становится очевидным, что проблема в том, что для него требуется операция SORT, которая значительно замедляет работу.
Вот альтернатива, которую я извлек из структуры сущностей, которая не требует операции SORT и выполняет некластеризациюИндекс поиска.Это сокращает время выполнения до <2 секунд для вышеупомянутого набора записей. </p>
SELECT
[Limit1].[DocumentID] AS [DocumentID],
[Limit1].[Status] AS [Status],
[Limit1].[DateCreated] AS [DateCreated]
FROM (SELECT DISTINCT [Extent1].[DocumentID] AS [DocumentID] FROM [dbo].[DocumentStatusLogs] AS [Extent1]) AS [Distinct1]
OUTER APPLY (SELECT TOP (1) [Project2].[ID] AS [ID], [Project2].[DocumentID] AS [DocumentID], [Project2].[Status] AS [Status], [Project2].[DateCreated] AS [DateCreated]
FROM (SELECT
[Extent2].[ID] AS [ID],
[Extent2].[DocumentID] AS [DocumentID],
[Extent2].[Status] AS [Status],
[Extent2].[DateCreated] AS [DateCreated]
FROM [dbo].[DocumentStatusLogs] AS [Extent2]
WHERE ([Distinct1].[DocumentID] = [Extent2].[DocumentID])
) AS [Project2]
ORDER BY [Project2].[ID] DESC) AS [Limit1]
Теперь я предполагаю что-то, что не полностью указано в исходном вопросе, но если ваш дизайн таблицы таков, чтоваш столбец идентификатора является идентификатором автоинкремента, а DateCreated устанавливается на текущую дату с каждой вставкой, тогда даже без выполнения моего запроса, приведенного выше, вы можете получить значительное повышение производительности решения gbn (около половины времени выполнения), простос упорядочение по идентификатору вместо упорядочивания по DateCreated , поскольку это обеспечит идентичный порядок сортировки и будет более быстрой сортировкой.