Получение последней записи в каждой группе из базы данных с дополнительным условием 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;

При правильных индексах коррелированный подзапрос обычно быстрее. Однако разница в производительности не так уж велика.

Другие вопросы по тегам