2017-11-08 14 views
1

私はタイムスタンプ付きの最初と次の行の間にタイムスタンプを取得する方法を探しています。テーブルのアイデアは、ライトがスイッチオンされた時間を記録することです。SQL | 2行の時間差を計算する

私は現在持っているレイアウトは、だからここの考えは、私がID 1と3、そして4と一緒に来て、次のいずれかの間の時間を計算することができると思いますが...

| id | light_id | timestamp   | log_type_id | 
___________________________________________________ 
| 1 |  1 | current_timestamp |   1 | 
| 2 |  4 | current_timestamp |   1 | 
| 3 |  1 | current_timestamp |   2 | 
| 4 |  1 | current_timestamp |   1 | 

です同じlight_id。私はこれがこの種の伐採を行う最善の方法であるかどうかわかりません。人々がより良い解決策を持っているならば、私は意見を公開しています:)。

log_type_id 1 = on log_type_id 2 = off

答えて

1

それはアクセスせずに、まだなんとかだけれどもはい、それはそれを行うには良い方法ですが、MySQLでは、あなたが鉛のためのMySQL 8.0を待つ必要があります()とラグ()解析関数分析関数に変換する。

はここでそれを古い学校の方法を行うための2つの例です、最初はより伝統的である:

select t1.id, t1.light_id, t1.timestamp, t1.log_type_id 
    , l1.timestamp Prior_Timstamp 
    , timestampdiff(second, l1.timestamp, t1.timestamp) minutes 
    from YourData t1 
    left join YourData l1 
    on l1.id = (select max(id) from YourData m1 
       where m1.id < t1.id 
        and m1.light_id = t1.light_id); 

そして、この第二は、LIMITを/オフセット増やすことで、さらにバックあなたが見てできるようにすることができます句をOFFSET使用しています:ちょうど<から>への不平等を変更し、minに最大の最初のクエリまたは2番目のクエリでDESCからASCへ順に集計前方(リード)を探すために

select t1.id, t1.light_id, t1.timestamp, t1.log_type_id 
    , l1.timestamp Prior_Timestamp 
    , timestampdiff(second, l1.timestamp, t1.timestamp) minutes 
    from YourData t1 
    left join YourData l1 
    on l1.id = (select id from YourData m1 
       where m1.id < t1.id 
        and m1.light_id = t1.light_id 
       order by id desc limit 1 offset 0); 

ここにコードを示すSQL Fiddleがあります(@ Strawberryの要望によるコメントからは除外されています)。

+0

申し訳ありませんが、私はt1とl1で混乱していますか?それは同じテーブルを参照していますか? – tallent123

+0

私はこれをやったことがありますが、それはちょうど最も近い2つではなく、すべての行を戻しますか? – tallent123

+0

T1、L1、およびM1は、テーブルのエイリアスです。私はそれを複数回クエリーに含めるので、各コピーを一意に識別する方法が必要なので、エイリアスを付けます。私はテーブル名の間に任意のキーワードASを省略し、簡潔にするためにエイリアスです。 L1からの出力列に異なる列名を与え、2つのタイムスタンプ間の分数を計算するためにクエリを編集しました。あなたはそれを見ることができます[ここでSQLのフィドル](http://sqlfiddle.com/#!9/7929e3/1) – Sentinel

関連する問題