我有一个 MySQL 数据库中一组坦克的历史数据表。我想找出大于 200 加仑/小时的罐容量波动。到目前为止,我的 SQL 语句是:
SELECT t1.tankhistid as start, t2.tankhistid as end
FROM
(SELECT * from tankhistory WHERE tankid = ? AND curtime BETWEEN ? AND ?) AS t1
INNER JOIN
(SELECT * from tankhistory WHERE tankid = ? AND curtime BETWEEN ? AND ?) AS t2
ON t1.tankid = t2.tankid AND t1.curtime < t2.curtime
WHERE TIMESTAMPDIFF(HOUR, t1.curtime, t2.curtime) < 1 AND ABS(t1.vol - t2.vol) > 200
ORDER BY t1.tankhistid, t2.tankhistid
在上面的代码中,curtime是插入记录时的时间戳,tankhistid是表整数主键,tankid是个体罐id,vol是体积读数。
这会返回太多结果,因为每 5 分钟收集一次数据,并且波动可能需要数小时(多行具有相同的 id,然后是开始列),或者仅超过 10 分钟(多行具有相同的开始或结束 id)。示例输出:
7514576,7515478
7515232,7515478
7515314,7515478
7515396,7515478
7515478,7515560
7515478,7515642
7515478,7515724
请注意,所有这些行都应该只有一个:7514576,7515724。对于坦克一天的数据,查询需要 4 分钟,因此任何加速都会很棒。我猜有一种方法可以获取当前查询并将其用作子查询,但我不确定如何进行过滤。