您可能还想考虑将汇总信息移动到不同的表中,这样您就不会最终陷入想知道您正在查看的是“原始”数据还是汇总数据的情况。其他好处是您可以在 AVG 中包含 MAX、MIN、STDDEV 和其他值。
棘手的部分是划分时间。我能想到的最好方法是从CONVERT(blah, Timestamp, 120)
函数的输出开始:
-- Result: 2015-07-08 20:50:55
SELECT CONVERT(VARCHAR(19), CURRENT_TIMESTAMP, 120)
通过在一小时后或 10 分钟后将其切断,您可以截断时间:
-- Hour; result is 2015-07-08 20
SELECT CONVERT(VARCHAR(13), CURRENT_TIMESTAMP, 120)
-- 10-minute point; result is 2015-07-08 20:50:5
SELECT CONVERT(VARCHAR(15), CURRENT_TIMESTAMP, 120)
稍微按摩一下,您可以填写其中任何一个的分钟数,CAST
然后返回 a DATETIME
or DATETIME2
:
-- Hour increment
CAST(CONVERT(VARCHAR(13), CURRENT_TIMESTAMP, 120) + ':00' AS DATETIME)
-- 10-minute increment
CAST(CONVERT(VARCHAR(15), CURRENT_TIMESTAMP, 120) + 0' AS DATETIME)
使用上面的逻辑,所有时间都被截断。换句话说,小时公式会将Timestamp
地点转换11:00 <= Timestamp < 12:00
为 11:00。分钟公式会将Timestamp
地点转换11:20 <= Timestamp < 11:30
为 11:20。
所以更好的部分查询看起来像这样(我已经忽略了你刚刚总结的行):
-- The hour-increment version
INSERT INTO myTableOrOtherTable
SELECT
CAST(CONVERT(VARCHAR(13), [Timestamp], 120) + ':00' AS DATETIME),
AVG(CPU),
AVG(App1),
AVG(App2)
FROM myTable
GROUP BY
CAST(CONVERT(VARCHAR(13), [Timestamp], 120) + ':00' AS DATETIME)