Получение последней записи в каждой группе из базы данных – SQL Server 2005/2008

Я сделал некоторое seaching, не может показаться, чтобы получить результаты, которые я ищу. В принципе, у нас есть четыре разные системы управления на всей нашей компании, и я постоянно собираю все данные из каждой системы. Моя цель – обновлять данные каждый час в центральной базе данных. Вот пример набора данных, с которым я работаю:

COMPUTERNAME | SERIALNUMBER | USERNAME | LASTIP | LASTUPDATE | SOURCE TEST1 | 1111 | BOB | 1.1.1.1 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 TEST1 | 1111 | BOB | 1.1.1.1 | 1/18/2011 01:00:00 | MGMT_SYSTEM_2 TEST1 | 1111 | PETER | 1.1.1.11 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 TEST2 | 2222 | GEORGE | 1.1.1.2 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 TEST3 | 3333 | TOM | 1.1.1.3 | 1/19/2011 01:00:00 | MGMT_SYSTEM_2 TEST4 | 4444 | MIKE | 1.1.1.4 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 TEST4 | 4444 | MIKE | 1.1.1.41 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 TEST5 | 5555 | SUSIE | 1.1.1.5 | 1/19/2011 01:00:00 | MGMT_SYSTEM_1 

Поэтому я хочу запросить эту основную таблицу и получить самую последнюю запись (основанную на LASTUPDATE), чтобы получить самую последнюю информацию об этой системе. Проблема в том, что одна система может быть в каждой базе данных, но, конечно, они никогда не будут иметь точного точного времени обновления.

Я ожидал бы получить что-то вроде этого:

 TEST1 | 1111 | PETER | 1.1.1.11 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 TEST2 | 2222 | GEORGE | 1.1.1.2 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 TEST3 | 3333 | TOM | 1.1.1.3 | 1/19/2011 01:00:00 | MGMT_SYSTEM_2 TEST4 | 4444 | MIKE | 1.1.1.41 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 TEST5 | 5555 | SUSIE | 1.1.1.5 | 1/19/2011 01:00:00 | MGMT_SYSTEM_1 

Я попытался использовать функцию MAX, но с этим могу получить только один столбец. И я не могу использовать это в подзапросе, потому что у меня нет уникального поля ID, которое дало бы мне последнюю обновленную запись. Одна из систем – это firebase database MySQL, а функция MAX в MySQL будет работать так, как мне нужно, чтобы возвращать только одну запись в GROUP BY, но она не работает в SQL Server.

Я думаю, мне нужно использовать MAX и LEFT JOIN, но мои попытки до сих пор не удались.

Ваша помощь будет принята с благодарностью. Я пробовал свой мозг последние 3-4 часа, пытаясь получить рабочий запрос. Эта основная таблица находится на сервере SQL Server 2005.

Благодаря!

 ;with cteRowNumber as ( select COMPUTERNAME, SERIALNUMBER, USERNAME, LASTIP, LASTUPDATE, SOURCE, row_number() over(partition by COMPUTERNAME order by LASTUPDATE desc) as RowNum from YourTable ) select COMPUTERNAME, SERIALNUMBER, USERNAME, LASTIP, LASTUPDATE, SOURCE from cteRowNumber where RowNum = 1 

В SQL Server наиболее эффективным решением часто является коррелированный подзапрос:

 select t.* from t where t.lastupdate = (select max(t2.lastupdate) from t t2 where t2.computername = t.computername ); 

В частности, это может воспользоваться индексом (computername, lastupdate) . Понятно, что причина этого быстрее, чем row_number() , потому что этот запрос просто отфильтровывает строки, которые не совпадают. Версия row_number() должна присоединяться к номеру строки ко всем строкам, прежде чем фильтровать – это больше обработки данных.

  • Кодировка Base64 в SQL Server 2005 T-SQL
  • Разделительная строка T-SQL
  • Как округлить время в T-SQL
  • Усекать время от времени до второго (удалить миллисекунды) в T-SQL
  • Использование курсора с динамическим SQL в хранимой процедуре
  • Параметр Pass Array в SqlCommand
  • Точность десятичного деления T-SQL
  • Преобразование Xml в таблицу SQL Server
  • Linq to Sql: множественные левые внешние соединения
  • Тестирование неравенства в T-SQL
  • SET против SELECT - В чем разница?
  • Interesting Posts

    Восстановить свернутое окно другого приложения

    Как использовать Split в терминале Mac OS X для разделения файлов непосредственно на другой каталог?

    Избегайте блокировки компаниями электронной почты для массового / массового рассылки электронной почты?

    Когда следует использовать std :: size_t?

    Цветовая схема не применяется в iTerm2

    Есть ли в .NET математический оценщик строк?

    Загрузите ссылку itunes для приложения перед отправкой

    Имя пользователя Bittorrent Sync

    Программно создавать статические массивы во время компиляции в C ++

    Проверьте, является ли переменная строкой в ​​JavaScript.

    Заменить getMap с помощью getMapAsync

    Spring Java Config: как вы создаете @Bean с прототипом с аргументами времени исполнения?

    Как отправить файл с устройства Android на другое устройство через Bluetooth по коду

    длинный длинный в C / C ++

    # 1071 – Указанный ключ слишком длинный; максимальная длина ключа – 1000 байт

    Давайте будем гением компьютера.