PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Funkcja agregacji, aby uzyskać różnicę lub stosunek dwóch wierszy w kolejności

Ponieważ there are only two rows per price , może to być dużo prostsze i szybsze:

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

Ta forma niesie ze sobą dodatkową korzyść, ponieważ możesz bezpośrednio używać wszystkich kolumn z obu wierszy.

Dla bardziej złożonych scenariuszy (nie jest to konieczne), możesz użyć funkcji okna, jak już wspomniano. Oto prostsze podejście niż sugerowane:

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;

Tutaj potrzebna jest tylko jedna funkcja okna. I jeden poziom zapytania, ponieważ DISTINCT ON jest stosowany po funkcje okna. Kolejność sortowania w oknie jest zgodna z ogólną kolejnością sortowania, co pomaga w wydajności.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zapisać String jako typ JSONB w postgresie podczas używania kleju AWS?

  2. funkcja xlookup w SQL

  3. [Laravel]:SQLSTATE[3F000]:Nieprawidłowa nazwa schematu

  4. Backup projektu bazy danych PostgreSQL - bez danych

  5. Filtruj według zakresu dat (ten sam miesiąc i dzień) w latach