Получить последнюю строку журнала для каждого уникального хоста из таблицы - PullRequest
0 голосов
/ 13 июля 2009

Я унаследовал приложение, которое записывает результаты некоторых ежедневных команд, которые выполняются на нескольких хостах, в таблицу MS-SQL. Теперь меня попросили предоставить представление / запрос, отображающий последнюю строку журнала для каждого хоста, чтобы получить обзор последних результатов.

Таблица похожа на эту:

------------------------------
|HOST    |LAST_RUN   |RESULT |
------------------------------
|SERVER1 |13-07-2009 |OK     |
|SERVER2 |13-07-2009 |Failed |
|SERVER1 |12-07-2009 |OK     |
|SERVER2 |12-07-2009 |OK     |
|SERVER3 |11-07-2009 |OK     |
------------------------------

В этом случае запрос должен вывести:

------------------------------
|HOST    |LAST_RUN   |RESULT |
------------------------------
|SERVER1 |13-07-2009 |OK     |
|SERVER2 |12-07-2009 |Failed |
|SERVER3 |11-07-2009 |OK     |
------------------------------

... так как это последние строки для каждого из хостов.

Я понимаю, что это может быть что-то простое, что мне не хватает, но я просто не могу понять, как это правильно: - (

Спасибо, Марк.

Ответы [ 4 ]

1 голос
/ 13 июля 2009

Вот быстрая версия:

SELECT lt.Host, lt.Last_Run, lt.Results
 from LogTable lt
  inner join (select Host, max(Last_Run) Last_Run
               from LogTable
               group by Host) MostRecent
   on MostRecent.Host = lt.Host
    and MostRecent.Last_run = lt.Last_Run

Это должно работать в большинстве систем SQL. Функции ранжирования в SQL Server 2005 или 2008 могут работать немного лучше.

1 голос
/ 13 июля 2009
Select Host, Last_Run, Result from 
(
   select ROW_NUMBER() OVER (PARTITION BY Host ORDER BY Last_Run DESC) AS row_number,
   Host, Last_Run, Result from Table1
) tempTable
where row_number = 1 
0 голосов
/ 14 июля 2009

Я думаю, что опечатка на дате LAST_RUN SERVER2.

Это дает тот же результат, что и все другие отличные ответы без использования подзапроса:

select t."HOST"
       , t."LAST_RUN"
       , t."RESULT"
from   yourtable t
       left outer join yourtable t2
       on t."HOST" = t2."HOST"
    and
       t2."LAST_RUN" > t."LAST_RUN"
where  t2."RESULT" is null;

И результат выглядит так:

|HOST    |LAST_RUN   |RESULT |
------------------------------
|SERVER1 |13-07-2009 |OK     |
|SERVER2 |13-07-2009 |Failed |
|SERVER3 |11-07-2009 |OK     |
0 голосов
/ 13 июля 2009
 select host, max (last_run) from t group by host

Получает вам хост и last_run, который вы хотите. Тогда

 (select host as h, last_run as lr, result as r from t) inner join (select host as h_max, max (last_run) as lr_max from t group by host) on h=h_max, lr=lr_max

Простите мой sql, если не точный - не пробовал и не искал, но вы поняли.

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