I'm assuming that what you want is to find the next, preceding record matching the id in time sequence and that there may be additional records matching the id in sequence after the record from which you want to do this calculation. If the records are ordered in time sequence and you know the value of the date for the current record of interest you can do:
select max(date) from table
where date < @currentDate and id = @currentId
where @currentDate and @currentId are set to the date and id of the row in question.
If you need to pull the exact, entire row where this date occurs, then you'll need to first select the date in a subquery, then find the row(s) that match the (local) max date and id.
select * from table
where id = @currentId
and date = (select max(date) from table
where date < @currentDate and id = @currentId)