sql >> Databasteknik >  >> RDS >> PostgreSQL

Subtrahera två poster i samma kolumn i en tabell

Du behöver något sätt att bestämma sekvensen av rader i score . Det finns ingen "naturlig ordning" i en tabell i en relationsdatabas. Så jag antar att du har ett id (eller en tidsstämpel eller något) för att beställa dina skivor efter. Eller är i garanterat vara större i varje ny rad? Då kan du bara beställa med i .

Frågan i sig är enkel - när du får reda på fönster funktioner :

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

Inklusive en förbättring av @Clodoaldo (se kommentar).

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

motsvarar, men mer elegant än:

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

Syftet är att täcka specialfallet för den första raden som inte har någon föregående rad.
Demo på sqlfiddle.

sum(result) är trivial eftersom den är bunden att vara lika med den sista i enligt din beskrivning:

SELECT i
FROM   score
ORDER  BY id DESC
LIMIT  1;


  1. Upptäcker kolumnändringar i en postgres-uppdateringstrigger

  2. Har någon kommit på hur man skalar Amazon RDS-läsrepliker?

  3. Hur räknar man upp alla aktiverade roller för alla användare i PostgreSQL?

  4. MySQL concat() för att skapa kolumnnamn som ska användas i en fråga?