2

ユーザーとの間のメッセージを含むテーブルがあります。SQL を使用して、ユーザーが送信したすべてのメッセージを選択するにはどうすればよいですか。結果を MessageSenderUserID でグループ化したい。また、受信者ごとに最新のものだけを返したいと思っています。

has 句で MAX を使用しようとしましたが、それは正しい解決策ではないようです。

次のクエリの組み合わせとして最もよく説明できます。

SELECT TOP 1 MessageID, MessageSent, MessageSenderUserID, MessageRecipientUserID
FROM [Messaging_Message]
WHERE MessageSenderUserID = 799
ORDER BY MessageSent DESC

SELECT MessageSenderUserID
FROM [Messaging_Message]
GROUP BY MessageSenderUserID

ありがとう!

4

3 に答える 3

5

グループ内のトップ 1 アイテムを取得するこの (最も驚くべき & 楽しい) 方法をつい最近学びました。

select top 1 with ties
    MessageID, 
    MessageSent, 
    MessageSenderUserID, 
    MessageRecipientUserID
from [Messaging_Message]
order by row_number() over (partition by MessageSenderUserID 
                            order by MessageSent desc)

トリックは順になっています - 結果は部分ごとにパーティションにグループ化され、ソートキーによって並べ替えられます。その結果、各グループは最初の行に番号 1 を受け取ります。With tiesすべてのものを返します。ああ、応用機械の喜び!

于 2012-04-03T21:36:53.480 に答える
1
WITH TestTableCTE AS
(
    SELECT RN = ROW_NUMBER() OVER(PARTITION BY MessageSenderUserID ORDER BY MessageSent DESC),
           MessageID, MessageSent, MessageSenderUserID, MessageRecipientUserID
    FROM   [Messaging_Message]
)

SELECT MessageID, MessageSent, MessageSenderUserID, MessageRecipientUserID FROM TestTableCTE WHERE RN=1
于 2012-04-03T21:23:16.793 に答える
0

これは、ユーザーがまったく同時に複数のメッセージを送信できないことを前提としています(この場合、ユーザーに対して複数のメッセージが表示されます)。

SELECT a.MessageID, a.MessageSent, a.MessageSenderUserID, a.MessageRecipientUserID
FROM Messaging_Message AS a
    JOIN (
        SELECT MessageSenderUserID, MAX(MessageSent) AS MessageSent
        FROM Messaging_Message
        GROUP BY MessageSenderUserID
    ) AS b ON a.MessageSenderUserID = b.MessageSenderUserID
        AND a.MessageSent = b.MessageSent
于 2012-04-03T21:18:10.963 に答える