我有一个测量数据库,指示传感器、读数和读数的时间戳。只有在发生变化时才会记录测量值。我想生成一个结果集,显示每个传感器读取特定测量值的范围。
时间戳以毫秒为单位,但我以秒为单位输出结果。
这是表格:
CREATE TABLE `raw_metric` (
`row_id` BIGINT NOT NULL AUTO_INCREMENT,
`sensor_id` BINARY(6) NOT NULL,
`timestamp` BIGINT NOT NULL,
`angle` FLOAT NOT NULL,
PRIMARY KEY (`row_id`)
)
现在我正在使用子查询获得我想要的结果,但是当有很多数据点时它相当慢:
SELECT row_id,
HEX(sensor_id),
angle,
(
COALESCE((
SELECT MIN(`timestamp`)
FROM raw_metric AS rm2
WHERE rm2.`timestamp` > rm1.`timestamp`
AND rm2.sensor_id = rm1.sensor_id
), UNIX_TIMESTAMP() * 1000) - `timestamp`
) / 1000 AS duration
FROM raw_metric AS rm1
本质上,要获得范围,我需要获得下一个读数(如果没有另一个读数,则使用当前时间)。子查询查找晚于当前时间戳但来自同一传感器的最小时间戳。
此查询不会经常发生,因此我宁愿不必在时间戳列上添加索引并减慢插入速度。我希望有人可能对另一种方法提出建议。
更新: row_id应该与时间戳一起增加,但由于网络延迟问题不能保证。因此,具有较低 row_id 的条目可能出现在后面的 row_id 之后,尽管不太可能。