PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Subtrair dois registros da mesma coluna em uma tabela


Você precisa de alguma maneira de determinar a sequência de linhas em score . Não há "ordem natural" em uma tabela em um banco de dados relacional. Então, suponho que você tenha um id (ou um carimbo de data/hora ou algo assim) para ordenar seus registros. Ou é i garantido ser maior em cada nova linha? Então você pode simplesmente encomendar por i .

A consulta em si é simples - assim que você descobrir sobre a window funções :
SELECT i - lag(i, 1, 0) OVER (ORDER BY id) AS result
FROM   score
ORDER  BY id;

Incluindo uma melhoria do @Clodoaldo (ver comentário).
lag(i, 1, 0) OVER (ORDER BY id)

é equivalente, mas mais elegante do que:
COALESCE(lag(i) OVER (ORDER BY id), 0)

O objetivo é cobrir o caso especial da primeira linha que não tem linha anterior.
Demonstração no sqlfiddle.

sum(result) é trivial porque é obrigado a ser igual ao último i de acordo com sua descrição:
SELECT i
FROM   score
ORDER  BY id DESC
LIMIT  1;