PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Subtrahieren Sie zwei Datensätze derselben Spalte in einer Tabelle

Sie brauchen eine Möglichkeit, die Reihenfolge der Zeilen in score zu bestimmen . Es gibt keine "natürliche Reihenfolge" in einer Tabelle in einer relationalen Datenbank. Ich gehe also davon aus, dass Sie eine id haben (oder ein Zeitstempel oder so), um Ihre Aufzeichnungen zu ordnen. Oder ist i garantiert in jeder neuen Reihe größer? Dann können Sie einfach per i bestellen .

Die Abfrage selbst ist einfach – sobald Sie sich über das Fenster informiert haben Funktionen :

SELECT i - lag(i, 1, 0) OVER (ORDER BY id) AS result
FROM   score
ORDER  BY id;

Inklusive einer Verbesserung von @Clodoaldo (siehe Kommentar).

lag(i, 1, 0) OVER (ORDER BY id)

ist äquivalent zu, aber eleganter als:

COALESCE(lag(i) OVER (ORDER BY id), 0)

Zweck ist es, den Sonderfall der ersten Zeile abzudecken, die keine vorangehende Zeile hat.
Demo auf sqlfiddle.

sum(result) ist trivial, weil es zwangsläufig gleich dem letzten i ist nach deiner Beschreibung:

SELECT i
FROM   score
ORDER  BY id DESC
LIMIT  1;