SQL -Gruppierung: neueste Aufzeichnung zwischen Benutzern
Frage
Vielleicht habe ich einen wirklich schlechten Tag, aber könnte mir jemand helfen, dies zu drehen:
MessageID | SendingUserID | ReceivingUserID
-------------------------------------------
1073 | 1002 | 1001
1065 | 1001 | 1002
1076 | 1008 | 1002
Hinein:
MessageID | SendingUserID | ReceivingUserID
-------------------------------------------
1073 | 1002 | 1001
1076 | 1008 | 1002
Wo ist nur die neueste Nachricht zwischen zwei Benutzern aufgeführt?
Lösung
Versuche dies:
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
)
Andere Tipps
Der exklusive Selbstansatz:
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
Der Join auf "B" sucht nach späteren Nachrichten zwischen denselben Benutzern. Die Where -Klausel filtert nach Nachrichten, die keine spätere Nachricht haben. Dies gibt Ihnen nur die neueste Nachricht zwischen jedem Benutzerpaar.
Sie können einen CTE (Common Table Expression) in SQL Server 2005 und höher verwenden, um sicherzustellen, dass die beiden Benutzer -ID immer die kleinere vor dem größeren sind, und erhalten dann nur das Maximum für jede dieser Kombinationen:
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)
Die innere Auswahl im CTE würde Ihre Nachrichten wie diese "bestellen":
MessageID User1 User2
1065 1001 1002
1073 1001 1002
1076 1002 1008
und die äußere SELECT
Basierend auf diesem CTE wählt dann einfach den Eintrag mit dem Maximum aus MessageID
Für jede Kombination von (user1, user2).
Marc