Если я правильно вас понял, вы ищете самую высокую «действительную дату», которая предшествует «сегодняшнему дню» (или любой заданной дате). Это может быть достигнуто с помощью бокового соединения в Postgres:
SELECT c.*, cd.customer_name
FROM customer c
JOIN LATERAL (
SELECT *
FROM customerdata cd
WHERE c.id = cd.customer_id
AND cd.customer_valid <= current_date
ORDER BY cd.customer_valid DESC
LIMIT 1
) cd on true
Более эффективным вариантом будет (на мой взгляд) сохранение начала и конца допустимого периода в daterange
столбец :
create table customer_data
(
customer_id int not null references customer,
valid_during daterange not null,
customer_name text
);
Перекрывающиеся диапазоны можно предотвратить с помощью ограничения исключения
И примеры диапазонов из вашего вопроса будут сохранены как
[2019-01-01,2020-01-01)
[2020-01-01,2021-01-01)
[2021-01-01,infinity)
)
означает, что правый край исключен.
Запрос становится таким простым, как:
SELECT c.*, cd.customer_name
FROM customer c
JOIN customer_data cd
on c.id = cd.customer_id
AND cd.valid_during @> current_date;