假设您有一个measure
包含两列datestamp
和temp
.
假设您想每六分钟(每小时 10 次)查看上周的温度。你可以做这种事情。我们稍后会开始定义trunc
。
SELECT trunc(datestamp) datestamp, AVG(temp) temp
FROM measure
WHERE datestamp >= CURDATE() - INVERVAL 7 DAY
GROUP BY trunc(datestamp)
ORDER BY trunc(datestamp)
这适用于任何合理的定义trunc
。在这种情况下trunc(t)
,返回发生的六分钟周期的开始t
。所以,trunc('1942-12-07 08:45:17')
给出1942-12-07 08:42:00
)。
这是每六分钟间隔一次的查询。
SELECT DATE_FORMAT(datestamp,'%Y-%m-%d %H:00') +
INTERVAL (MINUTE(datestamp) -
MINUTE(datestamp) MOD 6) datestamp,
AVG(temp) temp
FROM measure
WHERE datestamp >= CURDATE() - INVERVAL 7 DAY
GROUP BY DATE_FORMAT(datestamp,'%Y-%m-%d %H:00') +
INTERVAL (MINUTE(datestamp) -
MINUTE(datestamp) MOD 6)
ORDER BY 1
这使用内置日期算术而不是 unix 时间戳算术。
您可以使用存储功能使其更易于阅读。
DELIMITER $$
DROP FUNCTION IF EXISTS TRUNC_N_MINUTES$$
CREATE
FUNCTION TRUNC_N_MINUTES(datestamp DATETIME, n INT)
RETURNS DATETIME DETERMINISTIC NO SQL
COMMENT 'truncate to N minute boundary. For example,
TRUNCATE_N_MINUTES(sometime, 15) gives the nearest
preceding quarter hour'
RETURN DATE_FORMAT(datestamp,'%Y-%m-%d %H:00') +
INTERVAL (MINUTE(datestamp) -
MINUTE(datestamp) MOD n) MINUTE$$
DELIMITER ;
然后你的查询会说
SELECT TRUNC_N_MINUTES(datestamp, 6) datestamp, AVG(temp) temp
FROM measure
WHERE datestamp >= CURDATE() - INVERVAL 7 DAY
GROUP BY TRUNC_N_MINUTES(datestamp, 6)
ORDER BY TRUNC_N_MINUTES(datestamp, 6)
如果您想按 5、10、15 或分钟边界(每小时三个项目)进行汇总,只需使用该数字代替6
.
您将需要trunc()
几个小时的不同功能等。
每日摘要的trunc()
功能是DATE(datestamp)
。对于每月摘要,它是LAST_DAY(datestamp)
. 例如,
SELECT LAST_DAY(datestamp) month_ending, AVG(temp) temp
FROM measure
GROUP BY LAST_DAY(datestamp)
ORDER BY LAST_DAY(datestamp)
产生逐月总结。