PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verbinden Sie zwei Tische basierend auf Zeitstempeln in der Nähe

"In der Nähe" ist ziemlich verschwommen.
Um table2 beizutreten wobei timee liegt innerhalb von 10 Sekunden von dateee zukünftig:

SELECT *
FROM   table1 t1
LEFT   JOIN table2 t2 ON t2.timee BETWEEN t1.dateee
                                      AND t1.dateee + interval '10 sec';
  • Der LEFT JOIN behält Zeilen von table1 im Ergebnis, auch ohne Übereinstimmung in table2 .

  • Es kann mehrere Übereinstimmungen geben, sodass jede Zeile aus den Basistabellen mehrmals in verschiedenen Kombinationen zurückgegeben werden kann.

Alternative

Zum Verbinden aller Zeilen in table1 zur Zeile mit dem nächsthöheren Zeitstempel. Genau eine Zeile im Ergebnis pro Zeile auf table1 :

SELECT *
FROM   table1 t1
LEFT   JOIN LATERAL (
   SELECT *
   FROM   table2 t2
   WHERE  t2.timee >= t1.dateee
   ORDER  BY t2.timee
   LIMIT  1
   ) ON TRUE;

Ein Index auf (timee) ist für die Leistung unerlässlich.