PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Najbliższy rekord dla serii dat

Powinien być najprostszy i najszybszy z LEFT JOIN i 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;

Wynik (wartości fikcyjne):

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

Używam CTE aby podać wartości, może to być tabela lub funkcja, niezagnieżdżona tablica lub zestaw wygenerowany za pomocą generate_series() coś jeszcze. (Czy chodziło Ci o generate_series() przez "generate_sequence()"?)

Najpierw JOIN znaczniki czasu wyszukiwania we wszystkich wierszach w tabeli z wcześniejszym lub równym resulttime . Używam LEFT JOIN zamiast JOIN aby znaczniki czasu wyszukiwania nie były usuwane, gdy nie ma wcześniejszego resulttime w ogóle w tabeli.

Z DISTINCT ON (x.search_ts) w połączeniu z ORDER BY x.search_ts, r.resulttime DESC otrzymujemy największy (lub jeden z równie największych) resulttime który jest mniejszy lub równy każdemu znacznikowi czasu wyszukiwania.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak pg_column_size może być mniejszy niż octet_length?

  2. Utwórz kopię zapasową PostgreSQL za pomocą pg_dump i pg_dumpall

  3. Przekonwertować dostęp do PostgreSQL?

  4. Postgis - Jak pracować z typem danych „geografia” za pośrednictwem JDBC

  5. PostgreSql :tablica Json do wierszy przy użyciu łączenia bocznego