计算日期/时间部分的平均值

时间:2009-06-02 16:35:48

标签: mysql datetime select timespan

问题:

我有一个传感器读数数据库,带有读取传感器时间的时间戳。基本上它看起来像这样:

Sensor | Timestamp | Value

现在我想从这些数据中制作一个图表,我想制作几个不同的图表。假设我想要一个最后一天,一个是上周,一个是上个月。每个图的分辨率将不同,因此对于日图,分辨率将为1分钟。对于周图表,它将是一个小时,对于月图表,它将是一天或一天​​中的一天。

所以我想要一个输出,即每个分辨率的平均值(例如,Day =一分钟内的平均值,Week =一小时内的平均值等)

例如:

Sensor | Start | End | Average

如何在mySQL中轻松快速地完成此操作?我怀疑它会创建一个临时表或进行排序并将传感器数据与其连接以获得传感器的平均值?但我对mySQL的了解最多也是有限的。

有一种非常聪明的方法吗?

3 个答案:

答案 0 :(得分:7)

SELECT  DAY(Timestamp), HOUR(Timestamp), MINUTE(Timestamp), AVG(value)
FROM    mytable
GROUP BY
        DAY(Timestamp), HOUR(Timestamp), MINUTE(Timestamp) WITH ROLLUP
这里的

WITH ROLLUP子句为每个HOURDAY生成额外的行,其平均值如下:

SELECT  DAY(ts), HOUR(ts), MINUTE(ts), COUNT(*)
FROM    (
        SELECT  CAST('2009-06-02 20:00:00' AS DATETIME) AS ts
        UNION ALL
        SELECT  CAST('2009-06-02 20:30:00' AS DATETIME) AS ts
        UNION ALL
        SELECT  CAST('2009-06-02 21:30:00' AS DATETIME) AS ts
        UNION ALL
        SELECT  CAST('2009-06-03 21:30:00' AS DATETIME) AS ts
        ) q
GROUP BY
        DAY(ts), HOUR(ts), MINUTE(ts) WITH ROLLUP
2, 20, 0, 1
2, 20, 30, 1
2, 20, NULL, 2
2, 21, 30, 1
2, 21, NULL, 1
2, NULL, NULL, 3
3, 21, 30, 1
3, 21, NULL, 1
3, NULL, NULL, 1
NULL, NULL, NULL, 4

2, 20, NULL, 2这意味着COUNT(*) 2 DAY = 2HOUR = 20和所有会议记录都是{{1}}。

答案 1 :(得分:2)

不完全是你想要的结果表,但这是一个1分钟分辨率的启动器:

SELECT sensor,minute(timestamp),avg(value) 
FROM table 
WHERE <time period specifier limits to a single hour>
GROUP BY sensor, minute(timestamp)

答案 2 :(得分:2)

我使用的代码与此非常相似(未经测试,但它来自工作代码)

设置变量:

$seconds = 3600;
$start = mktime(...);  // say 2 hrs ago
$end   = .... // 1 hour after $start

然后运行查询

SELECT MAX(`when`) AS top_When, MIN(`when`) AS low_When,
   ROUND(AVG(sensor)) AS Avg_S,
   (MAX(`when`) - MIN(`when`)) AS dur, /* the duration in seconds of the actual period */
   ((floor(UNIX_TIMESTAMP(`when`) / $seconds)) * $seconds) as Epoch
   FROM `sensor_stats`
   WHERE `when` >= '$start' AND `when` <= '$end' and duration=30
   GROUP BY Epoch/*((floor(UNIX_TIMESTAMP(`when`) / $seconds)) * $seconds)*/

这样做的好处是你可以拥有你想要的任何时间段 - 甚至不需要将它们放在'圆形数字'上,比如一个完整的时钟小时(甚至是一个时钟分钟,0-59)。 / p>