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

Bagaimana cara memberi label grup di postgresql ketika kepemilikan grup bergantung pada baris sebelumnya?

A "pilih dalam pilihan" lebih umum disebut "subselect" atau "subquery" Dalam kasus khusus Anda, ini adalah subquery yang berkorelasi . LATERAL joins (baru di postgres 9.3) sebagian besar dapat menggantikan subquery yang berkorelasi dengan solusi yang lebih fleksibel:

Saya rasa Anda tidak membutuhkan keduanya di sini.

Untuk kasus pertama . Anda kueri ini mungkin lebih cepat dan lebih sederhana:

SELECT date, max(value) OVER (PARTITION BY grp) AS value
FROM  (
   SELECT *, count(value) OVER (ORDER BY date) AS grp
   FROM   test_fill_null
   ) sub;

count() hanya menghitung nilai bukan nol, jadi grp bertambah dengan setiap value non-null , sehingga membentuk kelompok sesuai keinginan. Ini sepele untuk memilih satu value bukan null per grp di bagian luar SELECT .

Untuk kasus kedua . Anda , saya akan menganggap urutan awal baris ditentukan oleh (id1, id2, tms) seperti yang ditunjukkan oleh salah satu pertanyaan Anda.

SELECT id1, id2, tms
     , count(step) OVER (ORDER BY id1, id2, tms) AS group_id
FROM  (
   SELECT *, CASE WHEN lag(tms, 1, '-infinity') OVER (PARTITION BY id1 ORDER BY id2, tms)
                       < tms - interval '5 min'
                  THEN true END AS step
   FROM   table0
   ) sub
ORDER  BY id1, id2, tms;

Beradaptasi dengan pesanan Anda yang sebenarnya. Salah satunya mungkin menutupinya:

PARTITION BY id1 ORDER BY id2  -- ignore tms
PARTITION BY id1 ORDER BY tms  -- ignore id2

SQL Fiddle dengan contoh yang diperluas.

Terkait:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mendapatkan kinerja tinggi di bawah transaksi besar (postgresql)

  2. pilih pernyataan dalam fungsi postgres yang dipanggil di dalam pemicu

  3. PostgreSQL Dapatkan datetime/timestamp acak antara dua datetime/timestamp

  4. Proses bersamaan memasukkan data dalam database

  5. Prioritas berdasarkan waktu dalam Permintaan Rekaman Aktif