Вот один вариант с использованием not exists
:
select t.*
from mytable t
where not exists (
select 1
from mytable t1
where
t1.category = t.category
and greatest(t1.date, date '2019-05-05') - least(t1.date, date '2019-05-05')
< greatest(t.date, date '2019-05-05') - least(t.date, date '2019-05-05')
)
Это дает вам «ближайшую» запись до 2019-05-05 для каждой группы (до или после).
Если, например, вам нужна ближайшая запись до 2019-05-05, это немного проще:
select t.*
from mytable t
where
t.date <= date '2019-05-05'
and not exists (
select 1
from mytable t1
where t1.category = t.category and t1.date <= date '2019-05-05' and t1.date > t.date
)