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

Funzione di aggregazione per ottenere la differenza o il rapporto di due righe in ordine

Poiché there are only two rows per price , può essere molto più semplice e veloce:

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

Questo modulo offre l'ulteriore vantaggio di poter utilizzare direttamente tutte le colonne di entrambe le righe.

Per scenari più complessi (non necessario per questo), è possibile utilizzare le funzioni della finestra come è stato sottolineato. Ecco un approccio più semplice di quello suggerito:

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;

Qui è necessaria solo una funzione finestra. E un livello di query, poiché DISTINCT ON viene applicato dopo funzioni della finestra. L'ordinamento nella finestra concorda con l'ordinamento generale, migliorando le prestazioni.