MySQL: Berechnung der Energieverbrauchsunterschiede zwischen aufeinanderfolgenden Zeilen anhand der Seriennummer (SN)
Dieses Dokument beschreibt eine Methode zur Berechnung der Differenz im Energieverbrauch zwischen aufeinanderfolgenden Zeilen in einer MySQL-Datenbank, gruppiert nach Seriennummer (SN).
Problem:
Anhand einer Tabelle mit Energieverbrauchsdaten besteht das Ziel darin, die Verbrauchsdifferenz für jede SN zu berechnen, die die Änderung zwischen dem aktuellen und dem vorherigen Wert für diese bestimmte SN darstellt.
Beispieldaten:
Die folgende Tabelle (EnergyLog
) veranschaulicht die anfängliche Datenstruktur:
SN | Date | Value |
---|---|---|
2380 | 2012-10-30 00:15:51 | 21.01 |
2380 | 2012-10-31 00:31:03 | 22.04 |
2380 | 2012-11-01 00:16:02 | 22.65 |
2380 | 2012-11-02 00:15:32 | 23.11 |
20100 | 2012-10-30 00:15:38 | 35.21 |
20100 | 2012-10-31 00:15:48 | 37.07 |
20100 | 2012-11-01 00:15:49 | 38.17 |
20100 | 2012-11-02 00:15:19 | 38.97 |
20103 | 2012-10-30 10:27:34 | 57.98 |
20103 | 2012-10-31 12:24:42 | 60.83 |
Gewünschte Ausgabe:
Die Abfrage sollte eine Tabelle mit einer hinzugefügten Consumption
-Spalte erzeugen:
SN | Date | Value | Consumption |
---|---|---|---|
2380 | 2012-10-30 00:15:51 | 21.01 | 0.00 |
2380 | 2012-10-31 00:31:03 | 22.04 | 1.03 |
2380 | 2012-11-01 00:16:02 | 22.65 | 0.61 |
2380 | 2012-11-02 00:15:32 | 23.11 | 0.46 |
20100 | 2012-10-30 00:15:38 | 35.21 | 0.00 |
20100 | 2012-10-31 00:15:48 | 37.07 | 1.86 |
20100 | 2012-11-01 00:15:49 | 38.17 | 1.10 |
20100 | 2012-11-02 00:15:19 | 38.97 | 0.80 |
20103 | 2012-10-30 10:27:34 | 57.98 | 0.00 |
20103 | 2012-10-31 12:24:42 | 60.83 | 2.85 |
SQL-Lösung:
Die folgende SQL-Abfrage verwendet benutzerdefinierte Variablen, um das gewünschte Ergebnis zu erzielen:
<code class="language-sql">SELECT EL.SN, EL.Date, EL.Value, IF(@lastSN = EL.SN, EL.Value - @lastValue, 0.00) AS Consumption, @lastSN := EL.SN, @lastValue := EL.Value FROM EnergyLog EL, (SELECT @lastSN := 0, @lastValue := 0) AS SQLVars ORDER BY EL.SN, EL.Date;</code>
Erklärung:
@lastSN
und @lastValue
: Dies sind benutzerdefinierte Variablen, die auf 0 initialisiert werden. @lastSN
verfolgt die zuletzt verarbeitete SN und @lastValue
speichert den zuletzt verarbeiteten Wert.IF(@lastSN = EL.SN, EL.Value - @lastValue, 0.00)
: Diese bedingte Anweisung prüft, ob die aktuelle SN mit der vorherigen SN übereinstimmt. Wenn dies der Fall ist, wird die Verbrauchsdifferenz berechnet. Andernfalls wird der Verbrauch auf 0,00 gesetzt (für den ersten Eintrag jeder SN).@lastSN := EL.SN, @lastValue := EL.Value
: Diese Zuweisungen aktualisieren die benutzerdefinierten Variablen nach der Verarbeitung jeder Zeile.ORDER BY EL.SN, EL.Date
: Diese Klausel stellt sicher, dass die Zeilen in der richtigen Reihenfolge (nach SN und dann nach Datum) verarbeitet werden, um genaue Differenzberechnungen zu ermöglichen.Dieser Ansatz berechnet effizient die Energieverbrauchsdifferenz für jede SN, indem er die Variablenverarbeitungsfunktionen von MySQL nutzt. Die Verwendung von ORDER BY
ist entscheidend für die Richtigkeit der Ergebnisse.
Das obige ist der detaillierte Inhalt vonWie berechnet man Energieverbrauchsunterschiede zwischen aufeinanderfolgenden Zeilen in MySQL von SN?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!