我有一个MySQL数据库,用于存储功率读数,每分钟添加一次读数。 (即每天1,440个读数)。
time power
---- -----
00:00:00 346
00:01:00 352
00:02:00 247
使用PHP我想从这些数据中生成一个图形,但我不希望图形上有1,440个点。我可能会选择将其分成15分钟(这将给我96分)。此外,我不想简单地采取每第15个值,因为这会产生误导性的结果。我想要做的是使用一个SQL查询,该查询在15分钟的块中返回数据,并将功率读数作为平均值。
输出可能如下所示:
starttime avgpower
--------- --------
00:00:00 342
00:15:00 490
00:30:00 533
是否有一个SQL函数可以为我执行此操作?或者我将不得不在我的PHP代码中执行此计算?
答案 0 :(得分:2)
您可以按分钟/ 4的舍入值进行分组,然后选择功率读数字段的平均值。您可能更喜欢使用floor函数来舍入分钟数。
答案 1 :(得分:2)
以下是您的查询:
SELECT STR_TO_DATE(CONCAT(DATE_FORMAT(`time`, '%H'), ':', (FLOOR(DATE_FORMAT(`time`, '%i') / 15) * 15), ':00'), '%H:%i:%s') `starttime`, AVG(`power`) `avgpower`
FROM `tablea`
GROUP BY `starttime`;
请随意根据您的架构替换表格(tablea
)和列(time
和power
)。
希望这有帮助。
答案 2 :(得分:0)
有同样的问题。正如Don Kirkby指出的那样,我用这段代码解决了它:
SELECT time, AVG(power) AS avgpower, ROUND(UNIX_TIMESTAMP(time)/(15*60)) AS timekey
FROM table
GROUP BY timekey