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: