sql >> Databasteknik >  >> RDS >> PostgreSQL

Närmaste rekord för en serie datum

Bör vara enklast och snabbast med en LEFT JOIN och 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ärden):

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

Jag använder en CTE för att tillhandahålla värdena kan det vara en tabell eller funktion eller okapslad array eller en uppsättning genererad med generate_series() något annat också. (Menade du generate_series() av "generate_sequence()"?)

Först JOIN söktidsstämplarna till alla rader i tabellen med tidigare eller lika stor resulttime . Jag använder LEFT JOIN istället för JOIN så att söktidsstämplar inte tas bort när det inte finns någon tidigare resulttime i tabellen överhuvudtaget.

Med DISTINCT ON (x.search_ts) i kombination med ORDER BY x.search_ts, r.resulttime DESC vi får den största (eller en av de lika största) resulttime som är mindre eller lika med varje söktidsstämpel.



  1. Microsoft Access Table Tips – Tricks och riktlinjer del III

  2. Php-skript Infogar UTF8 TILL MYSQL

  3. Rollup-funktion - Ersätt NULL

  4. Laddar fler objekt från databasen ~ Infinite Scroll