2013-11-26 117 views
1

使用SQL Server 2008R2我试图编写一个查询,它将返回特定时间范围内的所有值的总和(在本例中为15分钟的时间间隔)将用于识别缺失的数据(每个服务器应该返回每15分钟12个值)。我已经到了我能找到结果的地步,但我需要一种方法将它们全部结合在同一个查询中。代码下面(日期将通常由变量来定义,在这种情况下,使用2013年9月1日作为示例):SQL Server - 结合来自单个查询的结果

Select SUM(Accounted_for) 'accounted for',date,time,server 
from dbmetrics.dbo.tblmissing 
where DATE='09/01/2013' 
    and (TIME between '00:00:00' and '23:59:59') 
    and SERVER='Server01' 
group by DATE, TIME, server , DATEPART(hour,time), 
     DATEPART(MINUTE,time),DATEPART(second,time)/96 
GO 

结果沿着这个” 结果回来的返回线看起来像这样

Number Date   Time     Server 
4   2013-09-01  12:00:01.0000000  server01 
6   2013-09-01  12:00:02.0000000  server01 
2   2013-09-01  12:00:15.0000000  server01 
10  2013-09-01  12:15:02.0000000  server01 
2   2013-09-01  12:15:09.0000000  server01 

我想看到什么会

12  2013-09-01  12:00:00.0000  Server01 
12  2013-09-01  12:15:00.0000  Server01 
+2

你选择的样本数据的差。每个数据点的分钟恰好以15分钟的时间间隔方便着陆,两个时间框架巧合地加起来为12个。你可以包括几行像'12:03:26.0000000',并确保总和不会'比赛? –

+0

另外,是否有任何原因的日期和时间组件分开存储? – Kermit

+0

如果您需要四舍五入到最接近的15分钟时间间隔,您可能需要查看[this](http://stackoverflow.com/questions/830792/t-sql-round-to-nearest-15-分钟间隔)。 – Kermit

回答

1

您可能要GROUP BY[Server],而不是让MAX()[Server]。如上面Aaron Bertrand提到的,它恰好发生在15分钟的时间间隔内。该查询将按时到分钟并将数据分组。

SELECT SUM([Number]) AS [Number], 
     [Date], 
     CONVERT(time, DATEADD(minute, DATEDIFF(minute, 0, [Time]), 0)) AS [Time], 
     MAX([Server]) 
FROM [Table] 
GROUP BY [Date], 
      DATEADD(minute, DATEDIFF(minute, 0, [Time]), 0) 

See a demo