Gestern wurde eine interesting question gefragt, die eine Aktualisierung einer MySQL-Tabelle unter Verwendung der LAG erforderte. Betrachten Sie die folgende Eingabetabelle (links), und die gewünschte Ausgabe (rechts):LAG in MySQL während einer Aktualisierung simulieren
**INPUT** **OUTPUT**
ID TestDate PerformanceStatus (PS) ID TestDate PS PreviousPerformanceStatus
1 15/03/2016 0 1 15/03/2016 0 0
1 01/04/2016 2 1 01/04/2016 2 0
1 05/05/2016 1 1 05/05/2016 1 2
1 07/06/2016 1 1 07/06/2016 1 1
2 15/03/2016 0 2 15/03/2016 0 1
2 01/04/2016 2 2 01/04/2016 2 0
2 05/05/2016 1 2 05/05/2016 1 2
2 07/06/2016 3 2 07/06/2016 3 1
2 23/08/2016 1 2 23/08/2016 1 3
Mit anderen Worten, das Ziel zu PreviousPerformanceStatus
den Wert, der in dem Datensatz, bevor er existiert zuzuweisen, wie befohlen durch ID
dann TestDate
.
Die akzeptierte Antwort von @ spencer7593 verwendete eine korrelierte Unterabfrage. Was mir jedoch zuerst in den Kopf kam, war die Verwendung einer Benutzervariablen. Hier ist, wie ich antwortete:
SET @lag = 0;
UPDATE yourTable
SET PreviousPerformanceStatus = @lag,
@lag:=PerformanceStatus
ORDER BY ID, TestDate
Ich wurde gesagt, dass diese Antwort nicht stabil ist, aber ich frage mich, ob jemand erklären könnte, warum etwas schief gehen könnte, was in diesem Fall geschehen würde, und schließlich, was könnte wir tun, um hier eine Benutzervariable zu verwenden, um LAG zu simulieren.
Es ist mein Verständnis, dass die folgende SELECT
Abfrage überhaupt keine Probleme haben würde:
SELECT PerformanceStatus,
@lag AS PreviousPerformanceStatus,
@lag:=PerformanceStatus
FROM yourTable
ORDER BY ID, TestDate
Wenn jedoch dabei ein UPDATE
gibt es andere Überlegungen zu berücksichtigen.
Die update-Anweisung löst einen 1064-Fehler, so dass die Frage ein bisschen strittig ist. –
@ P.Salmon Gibt es eine Möglichkeit, den Fehler zu beheben? –
Der Fehler ist an, @ Lag: = PerformanceStatus, ich glaube nicht, dass Sie Variablen in einer Update-Anweisung festlegen können - also nein. –