1

私はこのようなテーブルを持っています:

---------------------------------------------
|Id | Step                  | StartedAt     |
---------------------------------------------
| 1 | Download Data         | 10:20:00      |
| 2 | Data Quality Control  | 10:45:00      |
| 3 | Run Prediction        | 10:47:00      |
---------------------------------------------

「データのダウンロード」に25分、「データ品質管理」に2分など、各ステップの時間を示すSQLクエリとは何ですか。

乾杯。

PS私のRDBMSはMySQLです。MySQLでこれを行う方法はありますか?

4

1 に答える 1

0

日付の境界を越えてこれを機能させるには、 datetimeortimestampの代わりに使用する必要があります。timeコメントを参照してください。

ほとんどの RDBMS の標準 SQL

これにはウィンドウ関数を使用します。現在、ほとんどの注目すべき RDBMS (MySQL を除く) に実装されています:

SELECT *
     ,lead("StartedAt") OVER (ORDER BY "StartedAt") - "StartedAt" AS duration
FROM  tbl;

lead()句の順序に従って、次の行の値を取得します。ORDER BY「次の」行がない最後の行では、NULL.

RDBMSに名前を付けていないため、ウィンドウ関数に関するPostgreSQLのマニュアルを引用します。

MySQL

ウィンドウ関数がない場合、1 つの方法は相関サブクエリを使用することです。

SELECT t1.*
     ,(SELECT t2."StartedAt"
       FROM tbl t2
       WHERE t2.id > t1.id
       ORDER BY t2."StartedAt"
       LIMIT 1) - "StartedAt" AS duration
FROM  tbl t1;

または、これはおそらくより高速です:

SELECT t1."Id", t1."Step", t1."StartedAt"
      ,TIMESTAMPDIFF(MINUTE, t1."StartedAt", min(t2."StartedAt")) AS minutes
FROM   tbl t1
LEFT   JOIN tbl t2 ON t2."Id" > t1."Id"
GROUP  BY t1."Id", t1."Step", t1."StartedAt";

->両方のクエリでsqlfiddle。

TIMESTAMPDIFF()またはについてのマニュアルTIMEPDIFF()

列がギャップなしで昇順である場合Id、これはより簡単になります。しかし、実際のテーブルではめったにありません。

于 2012-12-06T23:52:11.307 に答える