PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Функция за агрегиране, за да получите разликата или съотношението на два реда в ред

Тъй като there are only two rows per price , това може да бъде много по-просто и по-бързо:

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

Този формуляр носи допълнителното предимство, че можете да използвате директно всички колони от двата реда.

За по-сложни сценарии (не е необходимо за това), можете да използвате прозоречни функции, както беше посочено. Ето по-прост подход от предложения:

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;

Тук е необходима само една функция за прозорец. И едно ниво на заявка, тъй като DISTINCT ON се прилага след функции на прозореца. Редът на сортиране в прозореца е в съгласие с общия ред на сортиране, което спомага за производителността.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да закръгля стойността на милисекунди от timestamp(0) в PostgreSQL?

  2. Rails разширяващи полета с обхват, PG не го харесва

  3. Хибернацията не записва обект в базата данни?

  4. Как да намеря името на базата данни на папките \data\base postgres?

  5. Сортиране на списък от кортежи, като се има предвид локал (шведски ред)