Ограничить результаты отдельным именем системы, если возвращено несколько записей - PullRequest
0 голосов
/ 30 ноября 2011

Это работает на SQL Server 2000

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

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

Запрос, с которым я работаю, выглядит следующим образом:

SELECT SD.ProjectName, SD.SystemName, SD.Status, H.history_id
FROM dbo.SI_SystemDetail AS SD 
INNER JOIN dbo.SI_Projects AS P ON SD.ProjectName = P.ProjectName 
INNER JOIN dbo.SI_StatusHistory AS H ON SD.SystemName = H.SystemName   
WHERE     
    (P.Cancelled = 'N') 
    AND (P.Platform LIKE '%ibm%') 
    AND ('20110101' <= CONVERT(varchar(8), H.EffectiveDate, 112)) 
    AND (CONVERT(varchar(8), H.EffectiveDate, 112) <= '20111111')   
ORDER BY 
     H.history_id DESC, SD.SystemName, SD.ContactSBCuid, SD.ActualLiveDAte DESC, 
     SD.ProjectName, SD.SystemType, H.EffectiveDate`

Это вернет несколько дубликатов для имени системы, но мне нужен только один, который должен соответствовать наибольшему номеру history_id.Например, предположим, что существует сервер с именем:

Server Name        Status       History_ID  
Server01           Loading      1001
Server01           Configuring  1081
Server01           Testing      1101
Server01           Production   1451
Server02           Loading      1002
Server02           Configuring  1083
Server02           Testing      1104
Server02           Failed       1455

Мне просто нужно вернуть следующие результаты:

Server Name        Status       History_ID  
Server01           Production   1451
Server02           Failed       1455

Заранее спасибо за помощь.

1 Ответ

1 голос
/ 30 ноября 2011

UNTESTED:

SELECT SD.ProjectName, SD.SystemName, SD.Status, H.history_id 
FROM dbo.SI_SystemDetail AS SD 
INNER JOIN dbo.SI_Projects AS P 
  ON SD.ProjectName = P.ProjectName 
INNER JOIN dbo.SI_StatusHistory AS H 
  ON SD.SystemName = H.SystemName
WHERE (P.Cancelled = 'N') AND (P.Platform LIKE '%ibm%') AND ('20110101' <= CONVERT(varchar(8), H.EffectiveDate, 112)) AND (CONVERT(varchar(8), H.EffectiveDate, 112) <= '20111111')
AND history_ID = (
  Select max(history_ID) 
  FROM SI_Status_History iSH 
  where iSH.SystemName = SD.SystemName)
ORDER BY H.history_id DESC, SD.SystemName, SD.ContactSBCuid, SD.ActualLiveDAte DESC, SD.ProjectName, SD.SystemType, H.EffectiveDate
...