sql >> Base de Datos >  >> RDS >> PostgreSQL

Restar dos registros de la misma columna en una tabla

Necesita alguna forma de determinar la secuencia de filas en score . No existe un "orden natural" en una tabla en una base de datos relacional. Así que asumo que tienes un id (o una marca de tiempo o algo así) para ordenar sus registros. O es i garantizado que será mayor en cada nueva fila? Entonces puedes ordenar por i .

La consulta en sí es simple:una vez que se entera de window funciones :

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

Incluida una mejora de @Clodoaldo (ver comentario).

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

es equivalente a, pero más elegante que:

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

El propósito es cubrir el caso especial de la primera fila que no tiene una fila anterior.
Demostración en sqlfiddle.

sum(result) es trivial porque está obligado a ser igual a la última i según su descripción:

SELECT i
FROM   score
ORDER  BY id DESC
LIMIT  1;