2

日付スタンプ付きのイベントのテーブルがあり、イベント間の時間間隔を表示したいと考えています。たとえば、私が持っていた場合

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 秒以上かかるので、何かが間違っているに違いありません。

4

2 に答える 2