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

Bagaimana cara membandingkan baris saat ini dengan baris berikutnya dan sebelumnya di PostgreSQL?

Ini adalah solusi saya menggunakan WINDOW functions . Saya menggunakan lag dan lead fungsi. Keduanya mengembalikan nilai dari kolom dari baris dalam offset dari baris saat ini. lag kembali dan lead pergi berikutnya di offset.

SELECT tokcat.text
FROM (
    SELECT text, category, chartype, lag(category,1) OVER w as previousCategory, lead(category,1) OVER w as nextCategory
    FROM token t, textBlockHasToken tb
    WHERE tb.tokenId = t.id
    WINDOW w AS (
        PARTITION BY textBlockId, sentence
        ORDER BY textBlockId, sentence, position
    )
) tokcat
WHERE 'NAME' = ANY(previousCategory)
AND 'NAME' = ANY(nextCategory)
AND 'NAME' <> ANY(category)

Versi sederhana:

SELECT text
FROM (
    SELECT text
          ,category 
          ,lag(category) OVER w as previous_cat
          ,lead(category) OVER w as next_cat
    FROM   token t
    JOIN   textblockhastoken tb ON tb.tokenid = t.id
    WINDOW w AS (PARTITION BY textblockid, sentence ORDER BY position)
    ) tokcat
WHERE  category <> 'NAME'
AND    previous_cat = 'NAME'
AND    next_cat = 'NAME';

Poin utama

  • = ANY() tidak diperlukan, fungsi jendela mengembalikan satu nilai
  • beberapa bidang redundan di subkueri
  • tidak perlu mengurutkan per kolom, cukup PARTITION BY - ORDER BY berlaku di dalam partisi
  • Jangan gunakan pengidentifikasi huruf besar-kecil tanpa mengutip, itu hanya akan menimbulkan kebingungan. (Lebih baik lagi:jangan gunakan pengidentifikasi huruf besar-kecil di PostgreSQL sekali )


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Temukan n Tetangga Terdekat untuk Titik tertentu menggunakan PostGIS?

  2. Fungsi kesamaan di Postgres dengan pg_trgm

  3. Apa indeks yang tepat untuk menanyakan struktur dalam array di Postgres jsonb?

  4. Memanggil fungsi atau prosedur yang tersimpan tidak akan memasukkan dan mempertahankan perubahan

  5. Pemantauan PostgreSQL Penting - Bagian 3