Вы можете использовать CTE (Common Table Expression) в SQL Server 2005 и более поздних версиях, чтобы убедиться, что два идентификатора пользователя всегда меньше, чем перед большим, а затем просто получить максимум для каждой из этих комбинаций:
WITH Messages(MessageID, User1, User2)
AS
(
SELECT
MessageID,
CASE
WHEN SendingUserID < ReceivingUserID
THEN SendingUserID
ELSE ReceivingUserID
END as 'User1',
CASE
WHEN SendingUserID < ReceivingUserID
THEN ReceivingUserID
ELSE SendingUserID
END as 'User2'
FROM
MyMessages
)
SELECT
MessageID, User1, User2
FROM
Messages m1
WHERE
MessageID = (SELECT MAX(MessageID) FROM Messages m2
WHERE m1.User1 = m2.User1 AND m1.User2 = m2.User2)
Внутренний SELECT внутри CTE "упорядочит" ваши сообщения следующим образом:
MessageID User1 User2
1065 1001 1002
1073 1001 1002
1076 1002 1008
и внешний SELECT
, основанный на этом CTE, просто выбирает запись с максимальным значением MessageID
для каждой комбинации (User1, User2).
Марк