PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Unisci due tabelle in base a timestamp vicini

"Nelle vicinanze" è piuttosto confuso.
Per unirti a table2 dove timee si trova entro 10 secondi da dateee in futuro:

SELECT *
FROM   table1 t1
LEFT   JOIN table2 t2 ON t2.timee BETWEEN t1.dateee
                                      AND t1.dateee + interval '10 sec';
  • Il LEFT JOIN mantiene le righe da table1 nel risultato, anche senza corrispondenza in table2 .

  • Possono esserci più corrispondenze, in modo che ogni riga delle tabelle di base possa essere restituita più volte in varie combinazioni.

Alternativa

Per unire ogni riga in table1 alla riga con il timestamp successivo più alto. Esattamente una riga nel risultato per riga su 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;

Un indice su (timee) è essenziale per le prestazioni.