SQL Grouping: самая последняя запись между пользователями - PullRequest
2 голосов
/ 21 июня 2009

Может быть, у меня действительно плохой день, но может кто-нибудь помочь мне повернуть это:

MessageID | SendingUserID | ReceivingUserID
-------------------------------------------
1073      | 1002          | 1001
1065      | 1001          | 1002
1076      | 1008          | 1002

В

MessageID | SendingUserID | ReceivingUserID
-------------------------------------------
1073      | 1002          | 1001
1076      | 1008          | 1002

При этом отображается только самое последнее сообщение между двумя пользователями?

Ответы [ 3 ]

0 голосов
/ 21 июня 2009

Эксклюзивный подход самостоятельного объединения:

select *
from YourTable a
left join YourTable b 
    on (
        (a.SendingUserID = b.SendingUserID
        and a.ReceivinggUserID = b.ReceivingUserID)
        or (a.SendingUserID = b.ReceivingUserID
        and a.ReceivinggUserID = b.SendingUserID)
    ) and b.messageid > a.messageid
 where b.messageid is null

Объединение на "b" ищет более поздние сообщения между теми же пользователями. Предложение WHERE фильтрует сообщения, которые не имеют более поздних сообщений. Это дает вам только последнее сообщение между каждой парой пользователей.

0 голосов
/ 21 июня 2009

Вы можете использовать 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).

Марк

0 голосов
/ 21 июня 2009

попробуйте это:

SELECT Message.*
FROM Message
WHERE Message.MessageID IN
(SELECT MAX(MessageID) FROM Message 
    GROUP BY 
        CASE WHEN ReceivingUserID > SendingUserID 
            THEN ReceivingUserID ELSE SendingUserID END,
        CASE WHEN ReceivingUserID > SendingUserID
            THEN SendingUserID ELSE ReceivingUserID END
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...