PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Fungsi agregasi untuk mendapatkan perbedaan atau rasio dua baris secara berurutan

Karena there are only two rows per price , ini bisa banyak lebih sederhana dan lebih cepat:

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

Formulir ini membawa manfaat tambahan, yaitu Anda dapat menggunakan semua kolom dari kedua baris secara langsung.

Untuk skenario yang lebih kompleks (tidak perlu untuk ini), Anda dapat menggunakan fungsi jendela seperti yang telah ditunjukkan. Berikut adalah pendekatan yang lebih sederhana daripada yang disarankan:

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;

Hanya satu fungsi jendela yang diperlukan di sini. Dan satu tingkat kueri, karena DISTINCT ON diterapkan setelah fungsi jendela. Urutan pengurutan di jendela sesuai dengan urutan pengurutan keseluruhan, membantu kinerja.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ekstrak semua nilai dari json di tabel sql

  2. Gabungkan beberapa pernyataan SELECT

  3. Menggunakan fungsi jendela OVER di SQLAlchemy

  4. Rails 4:Menggunakan fungsi PostgreSQL untuk menyebabkan kesalahan dalam kueri karena tabel yang disertakan tidak digabungkan

  5. ActiveRecord::StatementInvalid, PG::UndefinedTable error, tetapi SQL yang dihasilkan berfungsi