用于在粒度时间跨度内收集数据的SQL语句

时间:2013-06-14 23:28:21

标签: sql sql-server sql-server-2008 tsql

我使用以下SQL Server 2008表结构在服务器上收集了CPU使用率数据:

CREATE TABLE [tbl] 
[id] BIGINT NOT NULL IDENTITY(1,1) PRIMARY KEY,
[dt] DATETIME2,   -- date/time when CPU usage was collected
[usage] TINYINT   -- value from [0 to 100]

此数据由服务器上运行的服务记录,频率约为。 5分钟。

所以我现在的目标是绘制一个显示CPU使用率的图表。为此,允许最终用户指定图形的“从”和“到”日期,并且图形本身被分成N个数据点。 (为简单起见,我们假设N是24。)

我想出了以下SQL语句来检索用于绘制在我的图表上的CPU使用率的N(或24)个数据点:

SELECT COUNT([usage]), SUM([usage]) FROM [tbl] 
 WHERE [dt]>='_DateDataPoint0_' AND [dt]<'_DateDataPoint1_'
UINON ALL
SELECT COUNT([usage]), SUM([usage]) FROM [tbl] 
 WHERE [dt]>='_DateDataPoint1_' AND [dt]<'_DateDataPoint2_'
--and so on, until Nth data point

以防:

"from" = June 14, 2013, 00:00:00
"to" = June 15, 2013, 00:00:00

我得到以下数据点日期/时间:

_DateDataPoint0_ = 2013-06-14 00:00:00
_DateDataPoint1_ = 2013-06-14 01:00:00
_DateDataPoint2_ = 2013-06-14 02:00:00
and so on ...
_DateDataPoint23_ = 2013-06-14 23:00:00
_DateDataPoint24_ = 2013-06-15 00:00:00

所以最后我的ASP.NET脚本会收到N对数据:

Count_Usage_DataPointN
Sum_Usage_DataPointN

因此,要在特定数据点获取使用次数,请执行以下操作:

Usage_N = Sum_Usage_DataPointN / Count_Usage_DataPointN

首先,我很好奇这是否是正确的做法?

其次,我很好奇上面选择的一些奇怪的结果。比方说,如果我的时间跨度为1小时,则生成的CPU使用率数据的峰值高于例如1天或一个月的时间跨度。这是正常的吗?似乎我的图表变得更平坦的时间越长。

1 个答案:

答案 0 :(得分:1)

这是预期的,因为您的图表上有一定数量的数据点。

您已将图表划分为24点。假设您想要显示2天的数据。当您每小时分配超过24点时,平均值(总和/计数)将变平。要显示每个尖峰,你需要在你的轴上有48个点。