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。
この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の制限にぶつかり、更新されたテーブルはWHERE
のUPDATE
句で(再び)参照できません。一般的な回避策は、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) ;