Tengo una tabla de registros ordenados por fecha. Hay un máximo de 1 registro por día, pero algunos días no hay registro (fines de semana y festivos).

Cuando consulto un registro por fecha, si no existe ningún registro para ese día, me interesa el registro anterior por fecha. P.ej:

SELECT * FROM rates WHERE date <= $mydate ORDER BY date DESC LIMIT 1;

Dada una lista de fechas, ¿cómo construiría una consulta para devolver múltiples registros que coincidan con el registro anterior exacto o más cercano para cada fecha? ¿Es esto posible lograrlo en una sola consulta?

La matriz de fechas puede estar distribuida en un período de tiempo grande, pero no necesariamente querría todos los registros en el período de tiempo completo (por ejemplo, consultar 20 fechas distribuidas en un período de tiempo de un año).

1
aaronrussell 10 oct. 2019 a las 14:55

1 respuesta

La mejor respuesta

Puede construir las fechas como una tabla derivada y luego usar la lógica SQL. Una unión lateral es conveniente:

select v.dte, r.*
from (values ($date1), ($date2), ($date3)
     ) v(dte) left join lateral
     (select r.*
      from rates r
      where r.date <= v.dte
      order by r.date desc
      limit 1
     ) r
     on 1=1;

Puede resultarle útil usar una matriz para pasar las fechas usando una matriz y usando unnest() en esa matriz.

2
Gordon Linoff 10 oct. 2019 a las 11:58