SQL-Abfrage (SQLite3, SQLite, DB3, DB)

BerlinerBaer

Mitglied
Hallo Programmierer-Gemeinde,

habe ein neues Anliegen. Ich arbeite an einem Projekt, welches mein Strom-, Gas- und Wasserverbrauch auswertet. Alles klappt mit Ausnahme der SQL-Ausgabe.

Ich habe eine Datenbank-Tabelle. In dieser sind sechs Spalten. Aus Bequemlichkeit zeige ich nur zwei Spalten.

Code:
+---------+
|Verbrauch|
+---------+
|Jahr     |
|aDatum   |
|aGas     |
+---------+
Soweit alles richtig. Nun geht es an die Ausgabe mittels SQL-Befehl
SQL:
SELECT
   StrFTime("%Y", a.aDatum) AS Jahr,
   a.aGas AS Gas,
   a.aGas -
   (SELECT
      b.aGas
   FROM
      Verbrauch b
   WHERE
      b.aGas < a.aGas
   ORDER BY
      b.aGas DESC) AS GasDif
FROM
   Verbrauch a
WHERE
   Jahr = "2010"

Soweit ist die Ausgabe auch korrekt. Mit Ausnahme folgender Daten:
Code:
+----+  +---+  +------+
|Jahr|  |Gas|  |GasDif|
+----+  +---+  +------+
|2010|  | 40|  |  NULL| // Korrekt!
|2010|  | 40|  |  NULL| // Korrekt!
|2010|  | 45|  |     5| // Korrekt!
|2010|  | 56|  |    11| // Korrekt!
|2010|  | 56|  |    11| // FALSCH! Warum hier die 11?
|2010|  | 56|  |    11| // FALSCH! Und hier?
|2010|  | 56|  |    11| // FALSCH! Und auch hier?
+----+  +---+  +------+

Die drei fragwürdigen Ausgaben habe ich kommentiert. Wie kann ich es anstellen, dass die Datenbank mir, statt der Elf, die Null ausgibt?

Über positive Rückmeldungen freue ich mich.

Liebe Grüße
BerlinerBaer
 
Lösung
Gut. Kann geschlossen werden. Ein Blick in meine Lernskripte hat gezeigt, dass ich mittels LAG() OVER () eine Ausgabe erhalte, mit der ich arbeiten kann.
SQL:
LAG(aGas, 1, 0) OVER (ORDER BY aDatum) AS GasDifferenz
Die gesamte SQL-Abfrage sieht dann wie folgt aus:
SQL:
SELECT
   StrFTime("%Y", aDatum) AS Jahr,
   aGas,
   LAG(aGas, 1, 0) OVER (ORDER BY aDatum) AS GasDifferenz
FROM
   Verbrauch
WHERE
   Jahr = "2010"
Und im Nachgang ziehe ich einfach den Gaswert von der GasDifferenz ab und erhalte die Differenz.

Thema kann geschlossen werden.

Liebe Grüße,
BerlinerBaer
Gut. Kann geschlossen werden. Ein Blick in meine Lernskripte hat gezeigt, dass ich mittels LAG() OVER () eine Ausgabe erhalte, mit der ich arbeiten kann.
SQL:
LAG(aGas, 1, 0) OVER (ORDER BY aDatum) AS GasDifferenz
Die gesamte SQL-Abfrage sieht dann wie folgt aus:
SQL:
SELECT
   StrFTime("%Y", aDatum) AS Jahr,
   aGas,
   LAG(aGas, 1, 0) OVER (ORDER BY aDatum) AS GasDifferenz
FROM
   Verbrauch
WHERE
   Jahr = "2010"
Und im Nachgang ziehe ich einfach den Gaswert von der GasDifferenz ab und erhalte die Differenz.

Thema kann geschlossen werden.

Liebe Grüße,
BerlinerBaer
 
Lösung
Zurück