sql >> Base de Datos >  >> RDS >> PostgreSQL

Únase a dos mesas según las marcas de tiempo cercanas

"Cerca" es bastante confuso.
Para unirse a table2 donde timee se encuentra dentro de los 10 segundos de dateee en el futuro:

SELECT *
FROM   table1 t1
LEFT   JOIN table2 t2 ON t2.timee BETWEEN t1.dateee
                                      AND t1.dateee + interval '10 sec';
  • El LEFT JOIN mantiene las filas de table1 en el resultado, incluso sin coincidencia en table2 .

  • Puede haber varias coincidencias, por lo que cada fila de las tablas base se puede devolver varias veces en varias combinaciones.

Alternativa

Para unir cada fila en table1 a la fila con la siguiente marca de tiempo más alta. Exactamente una fila en el resultado por fila en 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 índice en (timee) es esencial para el rendimiento.