Начните с извлечения последней даты для каждого owner_id, creator_id:
select owner_id,
creator_id as user_id,
max(created) as max_created
from data
where owner_id = 1
group by owner_id, creator_id
И того же для owner_id, receive_id:
select owner_id,
receiver_id as user_id,
max(created) as max_created
from data
where owner_id = 1
group by owner_id, receiver_id
Затем объедините и примените максимальное значение в другой раз:
select owner_id, user_id, max(max_created) as max_created
from (
[the first of the above]
union all
[the second of the above]
) as users
group by owner_id, user_id
Затем присоедините его к подзапросу:
select data.*
from data
join ([the union query above]) as max_dates
on max_dates.owner_id = data.owner_id
and max_dates.user_id in (data.creator_id, data.reporter_id)
and max_dates.max_created = data.created
where owner_id = 1 -- avoids scanning the whole table
Это приведет к строкам, в которых creator_id появился последним, и тем, где reporter_id появился последним.
Вы не можетеуменьшите его дальше, не удаляя допустимые строки.Предположим, что возвращаемыми парами (создатель / репортер) являются (1,2) и (2,1).Тогда обе строки будут исключены, если вы будете искать абсолютное последнее появление каждого пользователя.