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

Nærmeste rekord for en række datoer

Bør være enklest og hurtigst med en LEFT JOIN og 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;

Resultat (dummy-værdier):

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

Jeg bruger en CTE for at angive værdierne, kunne det være en tabel eller funktion eller ikke-indlejret array eller et sæt genereret med generate_series() også noget andet. (Mente du generate_series() af "generate_sequence()"?)

Først JOIN søgetidsstemplene til alle rækker i tabellen med tidligere eller lige så resulttime . Jeg bruger LEFT JOIN i stedet for JOIN så søgetidsstempler ikke slettes, når der ikke er nogen tidligere resulttime i tabellen overhovedet.

Med DISTINCT ON (x.search_ts) i kombination med ORDER BY x.search_ts, r.resulttime DESC vi får den største (eller en af ​​de ligeså største) resulttime der er mindre eller lig med hvert søgetidsstempel.



  1. Laravel Eloquent sammenligne dato fra datetime felt

  2. Hvornår fungerer MySQL ORDER BY RAND() i rækkefølge?

  3. Sådan får du en liste over måneder mellem to datoer i mysql

  4. Hvordan udfyldes gridview med mysql?