Diberikan dua tabel:
CREATE TABLE foo (ts timestamp, foo text);
CREATE TABLE bar (ts timestamp, bar text);
Saya ingin menulis query yang kembali nilai-nilai untuk ts
, foo
dan bar
yang mewakili pandangan terpadu yang paling nilai-nilai baru-baru ini. Dengan kata lain, jika foo
berisi:
ts | foo
--------
1 | A
7 | B
dan bar
berisi:
ts | bar
--------
3 | C
5 | D
9 | E
Saya ingin kueri yang mengembalikan:
ts | foo | bar
--------------
1 | A | null
3 | A | C
5 | A | D
7 | B | D
9 | B | E
Jika kedua tabel memiliki acara secara bersamaan, urutannya tidak menjadi masalah.
Saya telah berhasil membuat struktur yang dibutuhkan dengan menggunakan nilai union all dan dummy:
SELECT ts, foo, null as bar FROM foo
UNION ALL SELECT ts, null as foo, bar FROM bar
yang akan memberi saya garis waktu linier dari nilai-nilai baru, tapi saya tidak cukup bisa mengetahui bagaimana mengisi nilai nol berdasarkan baris sebelumnya. Saya sudah mencoba lag
fungsi jendela, tetapi AFAICT hanya akan melihat baris sebelumnya, tidak secara rekursif mundur. Saya telah melihat CTE rekursif, tapi saya tidak yakin bagaimana mengatur kondisi awal dan terminasi.
sumber
foo
danbar
benar - benar naik dari waktu ke waktu atau apakah test case menyesatkan dalam hal ini?Jawaban:
Gunakan a
FULL [OUTER] JOIN
, dikombinasikan dengan dua putaran fungsi jendela :Karena
count()
tidak menghitung nilai NULL, nilai ini hanya meningkat dengan setiap nilai bukan nol, sehingga membentuk grup yang akan berbagi nilai yang sama. Di bagian luarSELECT
,min()
(ataumax()
) juga mengabaikan nilai NULL, sehingga memilih satu nilai non-null per grup. Voila.FULL JOIN
Kasus terkait :Ini adalah salah satu kasus di mana solusi prosedural mungkin lebih cepat, karena dapat menyelesaikan pekerjaan dalam satu pemindaian. Seperti fungsi plpgsql ini :
Panggilan:
db <> bermain-main di sini , menunjukkan keduanya.
Jawaban terkait menjelaskan
#variable_conflict use_column
:sumber
coalesce
fungsi jendela -seperti.EXPLAIN ANALYZE
, terbaik dari 5 ...?IGNORE NULLS
(seperti Oracle: sqlfiddle.com/#!4/fab35/1 ).''
dan NULL.