2009-06-21 9 views
2

間の最近の記録はたぶん私は本当に悪い日抱えている、誰かが、おそらく私はこのターンするのに役立つ可能性があり:のみ、SQLグループ化:ユーザー

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

これにより:中に、

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

を2人のユーザー間の最新のメッセージが一覧表示されますか?

答えて

0

この試してみてください。排他的な自己

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 
) 
+0

「2人のユーザー間」要件に一致するように更新されました。 @unknown:集約なしでGroupByなしでSendingUserIDを選択することはできません – devio

+0

ただし、結果がパーティション内で一定でない場合、その結果は確定的ではありません。 –

+0

あなたの例をお寄せいただきありがとうございます。私はGroup ByのCasingによって少し混乱していますが、どちらも同じです - そうですか? – Nathan

0

は、アプローチに参加:

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

SQL Server 2005以降では、CTE(Common Table Expression)を使用して、2つのユーザーIDが常に大きいものよりも小さいものであることを確認してから、それぞれの組み合わせに対して最大値を取得することができます。

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) 

次のようにあなたのメッセージを「注文」でしょうCTE内部の内側のSELECT:このCTEに基づいて

MessageID User1 User2 
    1065  1001 1002 
    1073  1001 1002 
    1076  1002 1008 

と外側SELECTは、単にすべてのための最大MessageIDのエントリコムを選びます(User1、User2)の組み合わせ。

マーク