Получение последней записи в каждой группе из базы данных с дополнительным условием max () в MSSQL - PullRequest
0 голосов
/ 22 мая 2018

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

0 голосов
/ 22 мая 2018

Если у вас нет уникальности, то 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;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...