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

PostgreSQL - nilai kolom diubah - pilih pengoptimalan kueri

Beginilah cara saya melakukannya dengan analitik:

SELECT id, val
  FROM ( SELECT id, val
           ,LAG(val) OVER (ORDER BY id) AS prev_val
       FROM p ) x
  WHERE val <> COALESCE(prev_val, val)
  ORDER BY id

Pembaruan (beberapa penjelasan):

Fungsi analitik beroperasi sebagai langkah pasca-pemrosesan. Hasil kueri dipecah menjadi beberapa pengelompokan (partition by ) dan fungsi analitik diterapkan dalam konteks pengelompokan.

Dalam hal ini, kueri adalah pilihan dari p . Fungsi analitik yang diterapkan adalah LAG . Karena tidak ada partition by klausa, hanya ada satu pengelompokan:seluruh hasil yang ditetapkan. Pengelompokan ini diurutkan berdasarkan id . LAG mengembalikan nilai baris sebelumnya dalam pengelompokan menggunakan urutan yang ditentukan. Hasilnya setiap baris memiliki kolom tambahan (alias prev_val) yang merupakan val dari baris sebelumnya. Itu adalah subquery.

Kemudian kita cari baris dimana val tidak cocok dengan val dari baris sebelumnya (prev_val). COALESCE menangani kasus khusus dari baris pertama yang tidak memiliki nilai sebelumnya.

Fungsi analitik mungkin tampak agak aneh pada awalnya, tetapi pencarian pada fungsi analitik menemukan banyak contoh berjalan melalui cara kerjanya. Misalnya:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Ingatlah bahwa ini adalah langkah pasca-pemrosesan. Anda tidak akan dapat melakukan pemfilteran, dll. pada nilai fungsi analitik kecuali jika Anda melakukan subkueri.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bisakah Anda membuat indeks dalam definisi CREATE TABLE?

  2. Spring Boot data-jpa dan nativeQuery Postgres cast

  3. Bagaimana cara memperbaiki sqlalchemy.exc.DataError:(psycopg2.errors.StringDataRightTruncation)?

  4. Bagaimana cara memasukkan data biner ke dalam DB menggunakan Laravel?

  5. cara memindahkan tabel dari publik ke skema lain di Postgres