sql >> Databasteknik >  >> RDS >> PostgreSQL

Aggregationsfunktion för att få skillnaden eller förhållandet mellan två rader i ordning

Eftersom there are only two rows per price , detta kan vara mycket enklare och snabbare:

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

Detta formulär har den extra fördelen att du kan använda alla kolumner från båda raderna direkt.

För mer komplexa scenarier (inte nödvändigt för detta), kan du använda fönsterfunktioner som har påpekats. Här är ett enklare tillvägagångssätt än vad som har föreslagits:

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;

Endast en fönsterfunktion behövs här. Och en frågenivå, eftersom DISTINCT ON tillämpas efter fönsterfunktioner. Sorteringsordningen i fönstret stämmer överens med den övergripande sorteringsordningen, vilket hjälper prestanda.



  1. Hur kan jag validera data före infogning/uppdatering med SQL Server?

  2. Hur överför man en uppsättning rader från en funktion till en annan?

  3. Vad är nytt i MariaDB Cluster 10.4

  4. Mysql, Kontrollera fältvärdesändring?