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

Função de agregação para obter a diferença ou proporção de duas linhas em ordem


Como there are only two rows per price , isso pode ser muito mais simples e rápido:
SELECT n.item, n.price - o.price AS diff, n.price / o.price AS ratio
FROM   price n                 -- "new"
JOIN   price o USING (item)    -- "old"
WHERE  n.day > o.day;

->SQLfiddle

Este formulário traz o benefício adicional de que você pode usar todas as colunas de ambas as linhas diretamente.

Para cenários mais complexos (não é necessário para isso), você pode usar funções de janela como foi apontado. Aqui está uma abordagem mais simples do que o que foi sugerido:
SELECT DISTINCT ON (item)
       item
      ,price - lead(price) OVER (PARTITION BY item ORDER BY day DESC) AS diff
FROM   price
ORDER  BY item, day DESC;

Apenas uma função de janela é necessária aqui. E um nível de consulta, pois DISTINCT ON é aplicado depois funções da janela. A ordem de classificação na janela está de acordo com a ordem de classificação geral, ajudando no desempenho.