PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Nächster Datensatz für eine Reihe von Daten

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.