Запрос на возврат соответствующей или ближайшей предыдущей записи по списку дат - PullRequest
1 голос
/ 10 октября 2019

У меня есть таблица записей, упорядоченная по дате. Максимально 1 запись в день, но в некоторые дни запись отсутствует (выходные и праздничные дни).

Когда я запрашиваю запись по дате, если для этого дня нет записей, меня интересуетпредыдущая запись по дате. Например:

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

Учитывая список дат, как мне составить запрос для возврата нескольких записей, соответствующих точной или ближайшей предыдущей записи для каждой даты? Можно ли этого достичь в одном запросе?

Массив дат может быть разбросан по большому временному интервалу, но я не обязательно хочу, чтобы каждая запись за весь промежуток времени (например, запрос 20 дат распределен погодовой промежуток времени).

1 Ответ

2 голосов
/ 10 октября 2019

Вы можете построить даты как производную таблицу, а затем использовать логику SQL. Удобно боковое соединение:

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;

Может оказаться полезным использовать массив для передачи дат с использованием массива и использования unnest() для этого массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...