2014-09-01 2 views
0

Я использую следующий MS SQL запросSQL выбрать самую новую запись в SQL Server

SELECT Top(100) 
    DateTime, DisplayName, FullName,SampleValue 
FROM 
    OperationsManagerDW.dbo.vManagedEntity, 
    OperationsManagerDW.dbo.vPerformanceRule, 
    OperationsManagerDW.dbo.vPerformanceRuleInstance, 
    OperationsManagerDW.Perf.vPerfRaw 
WHERE 
    vPerfRaw.ManagedEntityRowId = vManagedEntity.ManagedEntityRowId 
    AND vPerfRaw.PerformanceRuleInstanceRowId = vPerformanceRuleInstance.PerformanceRuleInstanceRowId 
    AND vPerformanceRuleInstance.RuleRowId = vPerformanceRule.RuleRowId 
    AND vPerformanceRule.ObjectName = 'Memory' 
    AND vPerformanceRule.CounterName = 'PercentMemoryUsed' 
ORDER BY 
    DateTime DESC,Displayname, FullName 

И я получаю это

DateTime      FullName SampleValue 
--------------------------------------------------------- 
01.09.2014 13:23:29.200 N17.DE1.LOC 162.007 
01.09.2014 13:18:29.217 N17.DE1.LOC 160.298 
01.09.2014 13:18:29.187 N17.DE1.LOC 159.816 
01.09.2014 13:14:24.973 X-OM01.DE1.LOC 285.489 
01.09.2014 13:09:24.930 X-OM01.DE1.LOC 304.142 
01.09.2014 12:58:29.323 N17.DE1.LOC 159.469 
01.09.2014 12:58:29.277 N17.DE1.LOC 159.671 
01.09.2014 12:34:38.157 DC1.DE1.LOC 40.221 

но мне нужны только новые записи серверов (см FullName) :

01.09.2014 13:23:29.200 N17.DE1.LOC   162.007 
01.09.2014 13:14:24.973 X-OM01.DE1.LOC  285.489 
01.09.2014 12:34:38.157 DC1.DE1.LOC  40.221 

Прошу, пожалуйста, помощь. С уважением

+0

Вы можете использовать отдельное заявление. –

+0

@ R.T. : Кажется, что OP пытается группироваться по полю FullName, то есть 'N17.DE1.LOC 162.007' ->' N17.DE1.LOC' –

+0

[Плохие привычки пинать: используя JOIN-файлы старого стиля] (http: // sqlblog. com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - этот список таблиц * в стиле старого стиля * должен быть ** нет дольше использовать **, и вместо этого рекомендуется использовать ** соответствующий ANSI JOIN ** синтаксис, введенный с ANSI - ** 92 ** SQL Standard (более ** 20 лет ** назад) –

ответ

4

Для этого вы можете использовать функцию row_number. Попробуйте выполнить следующий запрос. Я предполагаю, что вам нужна последняя запись для каждого имени части.

WITH data 
AS 
(
SELECT Top(100) DateTime, DisplayName, FullName,SampleValue, 
ROW_NUMBER() OVER(PARTITION BY FullName ORDER BY DATETIME DESC) AS rowNum 
FROM OperationsManagerDW.dbo.vManagedEntity, 
OperationsManagerDW.dbo.vPerformanceRule, 
OperationsManagerDW.dbo.vPerformanceRuleInstance, 
OperationsManagerDW.Perf.vPerfRaw 
WHERE vPerfRaw.ManagedEntityRowId = vManagedEntity.ManagedEntityRowId 
AND vPerfRaw.PerformanceRuleInstanceRowId = vPerformanceRuleInstance.PerformanceRuleInstanceRowId 
AND vPerformanceRuleInstance.RuleRowId = vPerformanceRule.RuleRowId 
AND vPerformanceRule.ObjectName = 'Memory' 
AND vPerformanceRule.CounterName = 'PercentMemoryUsed' 

) 
SELECT * FROM data 
WHERE rowNum =1 
ORDER BY [DateTime] DESC,Displayname, FullName 
+0

Спасибо, что работает отлично! –

+0

Пожалуйста, не забудьте отметить это как ответ. –

0

В качестве альтернативы Кирану вы также можете сделать это с помощью подзапроса, а также с помощью соединений сделать его более читаемым.

select [fields] from 
    (Select top(100) datetime, id 
    from table1 
    order by datetime desc) T 
inner join [other tables] 
    on [join condition] 
order by datetime desc, displayname, fullname 
+0

отлично, я попробую! –

Смежные вопросы