日付スタンプ付きのイベントのテーブルがあり、イベント間の時間間隔を表示したいと考えています。たとえば、私が持っていた場合
event | datestamp
-------------------
a | 05:00
b | 07:00
c | 08:00
d | 12:00
...
私に与える簡単なクエリを書きたいのですが
event | datestamp | last | since_last
-----------------------------------------
a | 05:00 | NULL | NULL
b | 07:00 | a | 2 hours
c | 08:00 | b | 1 hour
d | 12:00 | c | 4 hours
最後の列の形式は重要ではありません。ミリ秒、秒、人間が読める形式など、簡単なものであれば何でもかまいません。また、実際のデータには適切な日時があることに注意してください。日付を入力するのが面倒です。
重要な部分は、直前のイベントとして「a」を指す「b」のレコードには何もないため、この質問のような解決策は機能しません - 結合されたすべてのレコードを選択するには、いくつかの構文が必要です最新の古いレコードに。
私が試したものは次のようになります
SELECT new.event, new.datestamp, old.event AS last,
TIMESTAMPDIFF(SECOND, MAX(old.datestamp), new.datestamp) AS since_last
FROM events AS new, events AS old
WHERE new.datestamp > old.datestamp
LIMIT 10;
しかし、ハングしているように見えます.1分以上実行させました。この質問ごとに、私は試しました
SELECT event, datestamp,
(SELECT MAX(old.datestamp)
FROM events old
WHERE new.datestamp > old.datestamp
) last_ds
FROM events new
LIMIT 10;
これは実際には機能しますが、10 レコードしか選択していないにもかかわらず、100 万のイベントがあるテーブルでは 14 秒以上かかるので、何かが間違っているに違いありません。