Powinien być najprostszy i najszybszy z LEFT JOIN
i 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;
Wynik (wartości fikcyjne):
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
Używam CTE
aby podać wartości, może to być tabela lub funkcja, niezagnieżdżona tablica lub zestaw wygenerowany za pomocą generate_series()
coś jeszcze. (Czy chodziło Ci o generate_series()
przez "generate_sequence()"?)
Najpierw JOIN
znaczniki czasu wyszukiwania we wszystkich wierszach w tabeli z wcześniejszym lub równym resulttime
. Używam LEFT JOIN
zamiast JOIN
aby znaczniki czasu wyszukiwania nie były usuwane, gdy nie ma wcześniejszego resulttime
w ogóle w tabeli.
Z DISTINCT ON (x.search_ts)
w połączeniu z ORDER BY x.search_ts, r.resulttime DESC
otrzymujemy największy (lub jeden z równie największych) resulttime
który jest mniejszy lub równy każdemu znacznikowi czasu wyszukiwania.