Трябва да е най-просто и бързо с LEFT JOIN
и 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;
Резултат (фиктивни стойности):
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
Използвам CTE
за предоставяне на стойностите може да бъде таблица или функция или невложен масив или набор, генериран с generate_series()
също нещо друго. (Може би имахте предвид generate_series()
от "generate_sequence()"?)
Първо АЗ JOIN
клеймата за време на търсене на всички редове в таблицата с по-ранен или равен resulttime
. Използвам LEFT JOIN
вместо JOIN
така че клеймата за време на търсене да не се изпускат, когато няма предишен resulttime
изобщо в таблицата.
С DISTINCT ON (x.search_ts)
в комбинация с ORDER BY x.search_ts, r.resulttime DESC
получаваме най-голямото (или едно от еднакво най-големите) resulttime
който е по-малък или равен на всяко времево клеймо за търсене.