Bör vara enklast och snabbast med en LEFT JOIN
och 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;
Resultat (dummy-värden):
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
Jag använder en CTE
för att tillhandahålla värdena kan det vara en tabell eller funktion eller okapslad array eller en uppsättning genererad med generate_series()
något annat också. (Menade du generate_series()
av "generate_sequence()"?)
Först JOIN
söktidsstämplarna till alla rader i tabellen med tidigare eller lika stor resulttime
. Jag använder LEFT JOIN
istället för JOIN
så att söktidsstämplar inte tas bort när det inte finns någon tidigare resulttime
i tabellen överhuvudtaget.
Med DISTINCT ON (x.search_ts)
i kombination med ORDER BY x.search_ts, r.resulttime DESC
vi får den största (eller en av de lika största) resulttime
som är mindre eller lika med varje söktidsstämpel.