MSSQL MAX返回所有结果?

时间:2018-02-20 11:23:56

标签: sql sql-server max

我尝试了以下查询,以便从06:00到18:00之间的最后一天返回每个ME.Name的最高P.Max值:

SELECT MAX(P.MaxValue) AS Value,P.DateTime,ME.Name AS ID
FROM            vManagedEntity AS ME INNER JOIN
                     Perf.vPerfHourly AS P ON ME.ManagedEntityRowId = P.ManagedEntityRowId INNER JOIN
                     vPerformanceRuleInstance AS PRI ON P.PerformanceRuleInstanceRowId = PRI.PerformanceRuleInstanceRowId INNER JOIN
                     vPerformanceRule AS PR ON PRI.RuleRowId = PR.RuleRowId
WHERE        (ME.ManagedEntityTypeRowId = 2546) AND (pr.ObjectName = 'VMGuest-cpu') AND (pr.CounterName LIKE 'cpuUsageMHz') AND (CAST(p.DateTime as time) >= '06:00:00' AND CAST(p.DateTime as time) <='18:00:00') AND  (p.DateTime > DATEADD(day, - 1, getutcdate())) 
group by ME.Name,P.DateTime
ORDER by id

但它似乎为每个ID返回每个MaxValue而不是最高?

像:

Value   DateTime    ID
55  2018-02-19 12:00:00.000 bob:vm-100736
51  2018-02-19 13:00:00.000 bob:vm-100736
53  2018-02-19 14:00:00.000 bob:vm-100736
52  2018-02-19 15:00:00.000 bob:vm-100736
52  2018-02-19 16:00:00.000 bob:vm-100736
51  2018-02-19 17:00:00.000 bob:vm-100736
54  2018-02-19 18:00:00.000 bob:vm-100736
51  2018-02-20 06:00:00.000 bob:vm-100736
51  2018-02-20 07:00:00.000 bob:vm-100736
53  2018-02-20 08:00:00.000 bob:vm-100736
52  2018-02-20 09:00:00.000 bob:vm-100736
78  2018-02-19 12:00:00.000 bob:vm-101
82  2018-02-19 13:00:00.000 bob:vm-101
79  2018-02-19 14:00:00.000 bob:vm-101
78  2018-02-19 15:00:00.000 bob:vm-101
79  2018-02-19 16:00:00.000 bob:vm-101
77  2018-02-19 17:00:00.000 bob:vm-101
82  2018-02-19 18:00:00.000 bob:vm-101
82  2018-02-20 06:00:00.000 bob:vm-101
79  2018-02-20 07:00:00.000 bob:vm-101
81  2018-02-20 08:00:00.000 bob:vm-101
82  2018-02-20 09:00:00.000 bob:vm-101
155 2018-02-19 12:00:00.000 bob:vm-104432

每个id每小时有一个值,因此每个id有12个结果

MAX不能以我想要的方式工作吗?

由于

这样的预期观点:

Value   DateTime    ID
55  2018-02-19 12:00:00.000 bob:vm-100736
82  2018-02-19 13:00:00.000 bob:vm-101
etc

1 个答案:

答案 0 :(得分:1)

如果您在datetime和id上使用group by,那么您将获得所有日期时间和所有ID,就这么简单。

如果您不需要确切时间,则只能按日期分组:

SELECT MAX(P.MaxValue) AS Value, cast(P.DateTime as date) as dat, ME.Name AS ID
...
group by ME.Name, cast(P.DateTime as date)

或者如果您这样做,您可以使用not exists子句代替group by