Один из способов - использовать row_number()
:
select t.*
from (select t.*,
row_number() over (partition by name order by datechanged desc) as seqnum
from t
where datechanged <= date '2018-04-01'
) t
where seqnum = 1 and salary > 100;
. Выбирает все строки до даты отсечения.Затем он перечисляет их и выбирает тот, у которого самая высокая дата, и сравнивает зарплату.
Это предполагает, что первая зарплата находится в таблице.