我为这里的问题找到了各种解决方案:
How to group time column into 5 minute intervals and max/min value respectively SQL?
解决任务的代码如下:
SELECT
FROM_UNIXTIME((UNIX_TIMESTAMP(table.timestamp) DIV 300) * 300) AS Timestamp,
val AS AgregatedValue
From foo
GROUP BY Timestamp
ORDER BY Timestamp
有人可以解释为什么提供的解决方案有效吗? 我找不到很好地描述其实际工作原理的答案。 为什么首先将DIV乘300秒,最后再乘300秒? 在“背景”中会发生什么?
我阅读了有关UNIX_TIMESTAMP(timestamp)
的文档,该文档自UTC 1970年1月1日00:00:00起以秒为单位将参数值返回为无符号整数。
我知道FROM_UNIXTIME()
可能是UNIX_TIMESTAMP(timestamp)
的反向功能
也许这个问题很愚蠢,但是我被困住了。
答案 0 :(得分:1)
答案在令牌DIV
中。
DIV
不仅将(/
)除,而且还隐式转换为整数。
您这样做是为了获得不带整数的整数。基本上,这与在分割后使用显式强制转换或在分割后使用ROUND()
或FLOOR()
相同。
参考:
https://dev.mysql.com/doc/refman/8.0/en/arithmetic-functions.html
整数除法。从除法中丢弃会导致任何小数 小数点右边的部分。
答案 1 :(得分:1)
UNIX_TIMESTAMP(table.timestamp)
包含一个日期,该日期存储为从1970-01-01 00:00:00'UTC开始的秒数。
5分钟内您有300秒
因此UNIX_TIMESTAMP(table.timestamp)
乘300会返回每300个零件中您拥有的零件数。
这个整数部分是一个乘以300的数字
UNIX_TIMESTAMP(table.timestamp) DIV 300) * 300
每5分钟返回一次秒数
最后一次转换
FROM_UNIXTIME((UNIX_TIMESTAMP(table.timestamp) DIV 300) * 300)
返回日期并用于分组依据
SELECT
FROM_UNIXTIME((UNIX_TIMESTAMP(table.timestamp) DIV 300) * 300) AS Timestamp,
val AS AgregatedValue
From foo
GROUP BY Timestamp
ORDER BY Timestamp