Harus paling sederhana &tercepat dengan LEFT JOIN
dan DISTINCT ON
:
WITH x(search_ts) AS (
VALUES
('2012-07-26 20:31:29'::timestamp) -- search timestamps
,('2012-05-14 19:38:21')
,('2012-05-13 22:24:10')
)
SELECT DISTINCT ON (x.search_ts)
x.search_ts, r.id, r.resulttime
FROM x
LEFT JOIN results r ON r.resulttime <= x.search_ts -- smaller or same
-- WHERE some_id = 15 -- some condition?
ORDER BY x.search_ts, r.resulttime DESC;
Hasil (nilai dummy):
search_ts | id | resulttime
--------------------+--------+----------------
2012-05-13 22:24:10 | 404643 | 2012-05-13 22:24:10
2012-05-14 19:38:21 | 404643 | 2012-05-13 22:24:10
2012-07-26 20:31:29 | 219822 | 2012-07-25 19:47:44
Saya menggunakan CTE
untuk memberikan nilai, bisa berupa tabel atau fungsi atau larik tidak bersarang atau kumpulan yang dihasilkan dengan generate_series()
sesuatu yang lain juga. (Apakah maksud Anda generate_series()
oleh "generate_sequence()"?)
Pertama saya JOIN
stempel waktu pencarian untuk semua baris dalam tabel dengan resulttime
yang lebih awal atau sama . Saya menggunakan LEFT JOIN
alih-alih JOIN
sehingga stempel waktu pencarian tidak dihapus ketika tidak ada resulttime
sebelumnya di tabel sama sekali.
Dengan DISTINCT ON (x.search_ts)
dalam kombinasi dengan ORDER BY x.search_ts, r.resulttime DESC
kita mendapatkan resulttime
terbesar (atau salah satu yang terbesar) yang lebih kecil atau sama dengan setiap stempel waktu penelusuran.