Raggruppamento SQL: record più recente tra utenti
Domanda
Forse sto passando una brutta giornata, ma qualcuno potrebbe forse aiutarmi a trasformare questo:
MessageID | SendingUserID | ReceivingUserID
-------------------------------------------
1073 | 1002 | 1001
1065 | 1001 | 1002
1076 | 1008 | 1002
Into:
MessageID | SendingUserID | ReceivingUserID
-------------------------------------------
1073 | 1002 | 1001
1076 | 1008 | 1002
Per cui è elencato solo il messaggio più recente tra due utenti?
Soluzione
prova questo:
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
)
Altri suggerimenti
L'approccio esclusivo di self join:
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
Il join su " b " cerca i messaggi successivi tra gli stessi utenti. La clausola WHERE filtra i messaggi che non hanno un messaggio successivo. Questo ti dà solo l'ultimo messaggio tra ogni coppia di utenti.
È possibile utilizzare un CTE (Common Table Expression) in SQL Server 2005 e versioni successive per assicurarsi che i due UserID siano sempre i più piccoli prima di quello più grande, e quindi ottengano il massimo per ciascuna di queste combinazioni:
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)
Il SELECT interno all'interno del CTE dovrebbe "ordinare" i tuoi messaggi in questo modo:
MessageID User1 User2
1065 1001 1002
1073 1001 1002
1076 1002 1008
e il SELEZIONA
esterno in base a questo CTE seleziona semplicemente la voce con il MessageID
massimo per ogni combinazione di (Utente1, Utente2).
Marc