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 または終了 ID を持つ複数の行) かかる可能性があるため、これはあまりにも多くの結果を返します。出力例:
7514576,7515478
7515232,7515478
7515314,7515478
7515396,7515478
7515478,7515560
7515478,7515642
7515478,7515724
これらの行はすべて、7514576,7515724 の 1 つだけである必要があることに注意してください。タンクのデータの 1 日分のクエリに 4 分しかかからないため、速度が向上することも大きなメリットです。現在のクエリを取得してサブクエリとして使用する方法があると思いますが、フィルタリングの方法がわかりません。