1

我有以下查询可在 SQL Server 2012 上运行,为我提供CounterValue列中值的每小时平均值:

select 
    dateadd(hour, datediff(hour, 0, CounterDateTime), 0), 
    avg(CounterValue) 
from mopsxactthroughput 
group by 
    dateadd(hour, datediff(hour, 0, CounterDateTime), 0)

如果可能的话,我想修改它,以便如果只有一条记录匹配该小时,则它在一小时内不返回任何行。例如,如果在 2013-06-06T20:00:00 和 2013-06-06T21:00:00 之间只有一条记录,我不希望在那一小时内返回任何行。

我对 a 的要求有点高SELECT,但也许有办法。(我的后备方法是返回按小时分组的所有记录,然后在 Java 中迭代自己设置的行并在那里应用平均/丢弃。)

4

2 回答 2

2

只需添加一个having子句:

select 
    dateadd(hour, datediff(hour, 0, CounterDateTime), 0), 
    avg(CounterValue) 
from mopsxactthroughput 
group by 
    dateadd(hour, datediff(hour, 0, CounterDateTime), 0)
having count(*) > 1
于 2013-07-21T00:11:59.010 回答
1

也许这个 CTE 有效:

with cte as( 
    select dateadd(hour, datediff(hour, 0, CounterDateTime), 0) as Hour, 
           avg(CounterValue)over(partition by dateadd(hour, datediff(hour, 0, CounterDateTime), 0)) as AvgCounter,
           Count(*)over(partition by dateadd(hour, datediff(hour, 0, CounterDateTime), 0)) as HourCount,
           CounterValue,
           CounterDateTime
    from mopsxactthroughput 
)
select Hour, CounterValue, CounterDateTime, AvgCounter
from cte
where HourCount > 1
于 2013-07-20T20:49:20.300 回答