web-dev-qa-db-ja.com

隣接する行間の差分データ

ReqTime DATETIME NOT NULL列とDuration INT UNSIGNED列を持つテーブル(Visitsと呼ばれる)があります。

期間は、隣接する2つの行のReqTimeの差に設定する必要があります。ただし、テーブルに新しい行を挿入する場合、Durationは設定されません。後で計算されます。

行Rの「期間」を、R.ReqTimeとN.ReqTimeの間の間隔(秒単位)として計算します。ここで、Nは次の行(最初の行、現在の行の後に挿入)です。

したがって、各行R(最後に挿入された行を除き、Nは未定義です)に対して、Duration値があります。

正しいDuration値でテーブルを更新するための擬似コードを参照してください(ここで、Rは現在の行で、Nは次の(後で挿入される)行です)。

UPDATEはSETR.Duration = TIMEDIFF(N.ReqTime、R.ReqTime)にアクセスしますWHERE R.Duration IS NULL

この問題を解決するにはカーソルを使用する必要がありますか?または、MIN/MAX/ORDER BYは問題ありませんか?

私はまだカーソルに慣れていません。

MySQL5。

2
porton

このSQLは、SQL Serverで正常に機能します(適切な構文の変更が必要です)。

UPDATE Visits
SET Duration = TimeDiff(
         ( SELECT ReqTime FROM Visits N WHERE n.ReqTime > R.ReqTime ORDER BY ReqTime LIMIT 1)
        ,R.ReqTime
    )
FROM Visits R ;

残念ながら、構文はMySQLの制限にぶつかり、更新されたテーブルはWHEREUPDATE句で(再び)参照できません。一般的な回避策は、JOINで書き直すことです。

UPDATE Visits R
  JOIN Visits U
    ON U.pk = ( SELECT N.pk                 -- the Primary Key of the table 
                FROM Visits N 
                WHERE N.ReqTime > R.ReqTime 
                ORDER BY N.ReqTime 
                LIMIT 1
              )
SET R.Duration = TimeDiff(U.ReqTime, R.ReqTime) ;
4
Pieter Geerkens