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

Aggregeringsfunktion til at få forskellen eller forholdet mellem to rækker i rækkefølge

Da there are only two rows per price , det kan være meget enklere og hurtigere:

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

Denne formular har den ekstra fordel, at du kan bruge alle kolonner fra begge rækker direkte.

Til mere komplekse scenarier (ikke nødvendigt for dette), kan du bruge vinduesfunktioner, som det er blevet påpeget. Her er en enklere tilgang end det, der er blevet foreslået:

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;

Kun én vinduesfunktion er nødvendig her. Og ét forespørgselsniveau, da DISTINCT ON anvendes efter vinduesfunktioner. Sorteringsrækkefølgen i vinduet stemmer overens med den overordnede sorteringsrækkefølge, hvilket hjælper på ydeevnen.



  1. Langsom MySQL-forespørgsel på opdateringserklæring

  2. Find de MINDSTE/STØRSTE værdier fra kombinerede KOLONNER, ignorer 0 &NULL-MYSQL

  3. Søg efter en given streng i alle felter i et helt skema for Oracle

  4. Laravel 5 + PostgreSQL:Database [postgres] ikke konfigureret. Fejl