1. Сгруппировать таблицу по (r,s), в t писать максимальное для группы время.
Это имеет смысл в целях оптимизации, если выполняются два условия:
1) сообщений так много, что время выполнения запроса становится некомфортным
2) количество сообщений сильно больше, чем количество пользователей (в разы как минимум). Если в среднем каждая пара пользователей пишет друг другу одно-два сообщения, то выигрыша в производительности не будет, кода будет в два раза больше, а толку - меньше.
2. Затем разбить эту таблицу на две:
- в первой r >=s
- во второй s >=r
Непонятно, что бы это значило. Хорошо бы пример кода привести. Возможно, вы имели в виду не "разбить", а "объединить саму с собой", и не "в первой r >=s, - во второй s >=r", а "первую часть оставить как есть, а во второй поменять местами r и s"? Тогда похоже на правду.
Но вот дальше не знаю, как отбирать.
Дальше остается самая простая часть - взять максимум.
Итого, если с оптимизацией (здесь
messages - это ваша исходная таблица с данными):
WITH last_msg AS (
SELECT sender, receiver, MAX(sending_time) AS sending_time
FROM messages
GROUP BY sender, receiver)
SELECT sender, receiver, MAX(sending_time) AS sending_time
FROM (SELECT sender, receiver, sending_time
FROM last_msg
UNION ALL
SELECT receiver, sender, sending_time
FROM last_msg) t
GROUP BY sender, receiver
Но сначала лучше выполнить без "оптимизации". Возможно, данных достаточно мало, и ощутимой разницы нет:
SELECT sender, receiver, MAX(sending_time) AS sending_time
FROM (SELECT sender, receiver, sending_time
FROM messages
UNION ALL
SELECT receiver, sender, sending_time
FROM messages) t
GROUP BY sender, receiver
Может быть есть какие-то операторы sql, упрощающие решение данной задачи?
Перед тем, как задавать такой вопрос, лучше уточнять, какая у вас СУБД (включая версию). Разработчики СУБД очень творчески подходят к реализации стандартов. У разных производителей есть разные операторы, функции, синтаксические конструкции и так далее. Но конкретно в этой задаче кроме
MAX и
UNION ALL, которые есть во всех СУБД, ничего не нужно.