PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Aggregationsfunktion, um die Differenz oder das Verhältnis zweier Zeilen in der Reihenfolge zu erhalten

Da there are only two rows per price , das kann viel sein einfacher und schneller:

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

Dieses Formular hat den zusätzlichen Vorteil, dass Sie alle Spalten aus beiden Zeilen direkt verwenden können.

Für komplexere Szenarien (dafür nicht notwendig), könnten Sie, wie bereits erwähnt, Fensterfunktionen verwenden. Hier ist ein einfacherer Ansatz als der vorgeschlagene:

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;

Hier wird nur eine Fensterfunktion benötigt. Und eine Abfrageebene, da DISTINCT ON wird nach angewendet Fensterfunktionen. Die Sortierreihenfolge im Fenster stimmt mit der Gesamtsortierreihenfolge überein, was die Leistung verbessert.