PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Record più vicino per una serie di date

Dovrebbe essere il più semplice e veloce con un LEFT JOIN e 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;

Risultato (valori fittizi):

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

Uso un CTE per fornire i valori, potrebbe essere una tabella o una funzione o un array non annidato o un set generato con generate_series() anche qualcos'altro. (Intendevi generate_series() per "generate_sequence()"?)

Per prima cosa JOIN il timestamp di ricerca a tutte le righe della tabella con resulttime precedente o uguale . Uso LEFT JOIN invece di JOIN in modo che i timestamp di ricerca non vengano eliminati quando non esiste un precedente resulttime nella tabella a tutti.

Con DISTINCT ON (x.search_ts) in combinazione con ORDER BY x.search_ts, r.resulttime DESC otteniamo il massimo (o uno dei più grandi) resulttime che è minore o uguale a ciascun timestamp di ricerca.