Так как Вы не указали базу данных, вот Вам решение, но оконные функции поддерживают не все =)
select distinct
first_value(message) over (partition by LEAST(sender_id, recipient_id),GREATEST(sender_id, recipient_id)
order by id desc)
from table
Если оконные функции не поддерживает, то будет выглядеть так
select message
from table
where id in (select max(id) from table group by LEAST(sender_id, recipient_id),GREATEST(sender_id, recipient_id))
Ну или можно через join переписать, но мне лень, думаю осилите ;-)