PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Най-близък запис за поредица от дати

Трябва да е най-просто и бързо с LEFT JOIN и 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;

Резултат (фиктивни стойности):

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

Използвам CTE за предоставяне на стойностите може да бъде таблица или функция или невложен масив или набор, генериран с generate_series() също нещо друго. (Може би имахте предвид generate_series() от "generate_sequence()"?)

Първо АЗ JOIN клеймата за време на търсене на всички редове в таблицата с по-ранен или равен resulttime . Използвам LEFT JOIN вместо JOIN така че клеймата за време на търсене да не се изпускат, когато няма предишен resulttime изобщо в таблицата.

С DISTINCT ON (x.search_ts) в комбинация с ORDER BY x.search_ts, r.resulttime DESC получаваме най-голямото (или едно от еднакво най-големите) resulttime който е по-малък или равен на всяко времево клеймо за търсене.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. OPENXML в Postgres

  2. Внедряване на история на таблицата на PostgreSQL

  3. Rails / Postgres:„трябва да се появи в клаузата GROUP BY или да се използва в агрегатна функция“

  4. Добавяне на колона към таблица във всички схеми на PostgreSQL база данни

  5. Как работи Trunc() в PostgreSQL