Sollte am einfachsten &schnellsten mit einem LEFT JOIN
sein und 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;
Ergebnis (Dummy-Werte):
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
Ich verwende einen CTE
um die Werte bereitzustellen, könnte eine Tabelle oder Funktion oder ein nicht verschachteltes Array oder ein mit generate_series()
auch etwas anderes. (Meinten Sie generate_series()
durch "generate_sequence()"?)
Zuerst JOIN
die Suchzeitstempel für alle Zeilen in der Tabelle mit früherer oder gleicher resulttime
. Ich verwende LEFT JOIN
statt JOIN
damit Suchzeitstempel nicht gelöscht werden, wenn es keine vorherige resulttime
gibt überhaupt in der Tabelle.
Mit DISTINCT ON (x.search_ts)
in Kombination mit ORDER BY x.search_ts, r.resulttime DESC
wir bekommen die größte (oder eine der ebenso größten) resulttime
das kleiner oder gleich jedem Suchzeitstempel ist.