sql >> Databáze >  >> RDS >> PostgreSQL

Nejbližší záznam pro sérii dat

Mělo by to být nejjednodušší a nejrychlejší s LEFT JOIN a 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;

Výsledek (fiktivní hodnoty):

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

Používám CTE k poskytnutí hodnot může být tabulka nebo funkce nebo nevnořené pole nebo sada vygenerovaná pomocí generate_series() také něco jiného. (Měli jste na mysli generate_series() pomocí "generate_sequence()"?)

Nejprve JOIN časová razítka hledání na všech řádcích v tabulce s dřívějším nebo stejným resulttime . Používám LEFT JOIN místo JOIN takže časová razítka hledání nebudou vynechána, když neexistuje žádný předchozí resulttime v tabulce vůbec.

S DISTINCT ON (x.search_ts) v kombinaci s ORDER BY x.search_ts, r.resulttime DESC dostaneme největší (nebo jeden ze stejně největších) resulttime která je menší nebo rovna každému časovému razítku vyhledávání.



  1. mySQL CAST a ASC / DESC

  2. Jak vytvořit dotaz v Drupal 8

  3. Jak použít cURL k načtení konkrétních dat z webové stránky a poté je uložit do mé databáze pomocí php

  4. získat seznam přátel v mysql