Zou het eenvoudigst en snelst moeten zijn met een LEFT JOIN
en 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;
Resultaat (dummy-waarden):
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
Ik gebruik een CTE
om de waarden te leveren, kan een tabel of functie zijn of een niet-geneste array of een set gegenereerd met generate_series()
ook iets anders. (Bedoelde je generate_series()
door "generate_sequence()"?)
Eerst JOIN
de zoektijdstempels naar alle rijen in de tabel met een eerdere of gelijke resulttime
. Ik gebruik LEFT JOIN
in plaats van JOIN
zodat zoektijdstempels niet worden verwijderd als er geen eerdere resulttime
. is helemaal niet in de tabel.
Met DISTINCT ON (x.search_ts)
in combinatie met ORDER BY x.search_ts, r.resulttime DESC
we krijgen de grootste (of een van de even grootste) resulttime
die kleiner is dan of gelijk is aan elke zoektijdstempel.