PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Soustraire deux enregistrements de la même colonne dans une table

Vous avez besoin d'un moyen de déterminer la séquence de lignes dans score . Il n'y a pas "d'ordre naturel" dans une table d'une base de données relationnelle. Donc je suppose que vous avez un id (ou un horodatage ou quelque chose) pour ordonner vos enregistrements. Ou est i garanti d'être plus grand dans chaque nouvelle ligne ? Ensuite, vous pouvez simplement commander par i .

La requête elle-même est simple - une fois que vous avez découvert window fonctions :

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

Dont une amélioration par @Clodoaldo (voir commentaire).

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

est équivalent à, mais plus élégant que :

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

Le but est de couvrir le cas particulier de la première ligne qui n'a pas de ligne précédente.
Démo sur sqlfiddle.

sum(result) est trivial car il est forcément égal au dernier i selon votre description :

SELECT i
FROM   score
ORDER  BY id DESC
LIMIT  1;