3

所以我的同事正在研究一个可以描述为这样的模式:

+--------------------+-----------+
| DATETIME timestamp | INT value |
+--------------------+-----------+

每 5 分钟输入一行,其中包含该时刻的值。

这就是棘手的地方。他希望获得 7 天间隔内每 8 小时的平均值。

当然,我可以想到涉及一些客户端代码的解决方案,我们想知道是否可以在 SQL 中做更多的事情。

所以本质上,他想要:

SELECT timestamp, value
  FROM table
 WHERE timestamp >= NOW() - INTERVAL 7 DAYS 
   AND timestamp <= NOW();

然后将其分解为 8 小时块,并对每个块的内容进行平均。(每个区块应该有 12 行,每天应该有 3 个区块)。

4

2 回答 2

1

尝试

SELECT avg(`value`)
FROM `table`
WHERE timestamp >= NOW() - INTERVAL 7 DAY AND timestamp <= NOW()
group by concat(date(`timestamp`), case when hour(`timestamp`) between 0 and 7 then 1
                                        when hour(`timestamp`) between 8 and 15 then 2
                                        else 3 end)
于 2012-07-31T15:15:52.443 回答
0

如果您不只在您的请求中执行它,您可以在执行请求之前尝试以下拆分间隔的方法:

boundary1 = NOW()
boundary2 = NOW()

FOR i = 0 to 21 //7 days, 3 intervals of 8 hours per days
    boundary1 = boundary2
    boundary2 = boundary1 - seconds(8 hours)
    req = "SELECT timestamp, value FROM table WHERE timestamp >= "+boundary2+" AND timestamp <= "+boundary1
ENDFOR
于 2012-07-31T15:12:05.370 回答