Получение последней записи в каждой группе из базы данных с дополнительным условием max() в MSSQL
Это дополнительный вопрос к извлечению последней записи в каждой группе из базы данных - SQL Server 2005/2008
В ответах был предоставлен этот пример для извлечения последней записи для группы параметров (в приведенном ниже примере извлекаются последние обновления для каждого значения в имени компьютера):
select t.*
from t
where t.lastupdate = (select max(t2.lastupdate)
from t t2
where t2.computername = t.computername
);
В моем случае, однако, "lastupdate" не является уникальным (некоторые обновления приходят пакетами и имеют одинаковое значение lastupdate, и если два обновления "computername" входят в один пакет, вы получите неуникальный вывод для "computername + lastupdate" "). Предположим, у меня также есть поле "rowId", которое просто автоинкрементно. Снижение будет включать в запрос другой критерий для поля max('rowId').
Примечание: хотя в примере используется специфичное для времени имя "lastupdate", фактические критерии выбора могут вообще не быть связаны со временем.
Поэтому я хотел бы спросить, какой будет наиболее производительный запрос, который выбирает последнюю запись в каждой группе на основе "параметра, определяющего группу" (в случае выше, "имя_компьютера") и максимального значения rowId?
1 ответ
Если у вас нет уникальности, то row_number()
проще:
select t.*
from (select t.*,
row_number() over (partition by computername order by lastupdate, rowid desc) as seqnum
from t
) t
where seqnum = 1;
При правильных индексах коррелированный подзапрос обычно быстрее. Однако разница в производительности не так уж велика.