Запрос для возврата совпадающей или ближайшей предыдущей записи по списку дат

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

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

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

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

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


person aaronrussell    schedule 10.10.2019    source источник
comment
Покажите нам некоторые примеры данных таблицы и ожидаемый результат. (Как форматированный текст, а не изображения.)   -  person jarlh    schedule 10.10.2019


Ответы (1)


Вы можете построить даты как производную таблицу, а затем использовать логику 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() в этом массиве.

person Gordon Linoff    schedule 10.10.2019
comment
Вы были намного быстрее меня, но мое решение очень похоже, поэтому я добавляю скрипку в качестве комментария здесь: dbfiddle.uk/ - person S-Man; 10.10.2019
comment
Потрясающий. Спасибо, это работает отлично. Использовал unnest() и в итоге потребовалось привести каждый элемент к дате в подзапросе, но без вашего ответа этого бы не произошло :). - person aaronrussell; 10.10.2019