PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Sottrarre due record della stessa colonna in una tabella

Hai bisogno di un modo per determinare la sequenza di righe in score . Non esiste un "ordine naturale" in una tabella in un database relazionale. Quindi presumo che tu abbia un id (o un timestamp o qualcosa del genere) per ordinare i tuoi record. Oppure è i garantito per essere maggiore in ogni nuova riga? Quindi puoi semplicemente ordinare tramite i .

La query in sé è semplice:una volta scoperto window funzioni :

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

Compreso un miglioramento di @Clodoaldo (vedi commento).

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

è equivalente, ma più elegante di:

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

Lo scopo è quello di coprire il caso speciale della prima riga che non ha una riga precedente.
Demo su sqlfiddle.

sum(result) è banale perché è destinato ad essere uguale all'ultimo i secondo la tua descrizione:

SELECT i
FROM   score
ORDER  BY id DESC
LIMIT  1;