sql >> Database >  >> RDS >> PostgreSQL

Aggregatiefunctie om het verschil of de verhouding van twee rijen op volgorde te krijgen

Aangezien there are only two rows per price , dit kan veel zijn eenvoudiger en sneller:

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

Dit formulier heeft als bijkomend voordeel dat u alle kolommen uit beide rijen direct kunt gebruiken.

Voor meer complexe scenario's (hiervoor niet nodig), zou je zoals eerder aangegeven vensterfuncties kunnen gebruiken. Hier is een eenvoudiger benadering dan wat is gesuggereerd:

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 is slechts één vensterfunctie nodig. En één zoekniveau, aangezien DISTINCT ON wordt toegepast na venster functies. De sorteervolgorde in het venster komt overeen met de algemene sorteervolgorde, wat de prestaties ten goede komt.



  1. Mysql-database verplaatsen van de ene server naar een andere server

  2. DBUtils kan de velden van een Java Bean niet invullen

  3. SQLite-databaselek gevonden

  4. Hoe WooCommerce-coupons worden opgeslagen in de database?