sql >> Database >  >> RDS >> PostgreSQL

Dichtstbijzijnde record voor een reeks datums

Zou het eenvoudigst en snelst moeten zijn met een LEFT JOIN en 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;

Resultaat (dummy-waarden):

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

Ik gebruik een CTE om de waarden te leveren, kan een tabel of functie zijn of een niet-geneste array of een set gegenereerd met generate_series() ook iets anders. (Bedoelde je generate_series() door "generate_sequence()"?)

Eerst JOIN de zoektijdstempels naar alle rijen in de tabel met een eerdere of gelijke resulttime . Ik gebruik LEFT JOIN in plaats van JOIN zodat zoektijdstempels niet worden verwijderd als er geen eerdere resulttime . is helemaal niet in de tabel.

Met DISTINCT ON (x.search_ts) in combinatie met ORDER BY x.search_ts, r.resulttime DESC we krijgen de grootste (of een van de even grootste) resulttime die kleiner is dan of gelijk is aan elke zoektijdstempel.



  1. De aggregatie-operator voor vermenigvuldiging in SQL

  2. datetime vs smalldatetime in SQL Server:wat is het verschil?

  3. Hoe het 'postgres.h'-bestand niet gevonden probleem op te lossen?

  4. Lijst met opgeslagen procedures/functies Mysql-opdrachtregel