0

tblMsgメッセージの保存に使用されるというテーブルがあります。送信者によって投稿された最後のメッセージ(表の列)を取得したいMessage

これが私の質問です

Select 
   Max(MsgId), Sender, Receiver, Contents, 
   convert(nvarchar(20), SendTime, 120) as SendTime
from 
   dbo.tblMessage 
where 
   Sender = @userName 
group by 
   Sender, Receiver, Contents, SendTime

ここでの問題は、最後のメッセージを取得する代わりに、送信者によって投稿されたすべてのメッセージを取得することです

4

2 に答える 2

2

問題は、実際にはSenderID列のみでグループ化する場合に、すべての列でグループ化することです。これを行う方法は、CTEとウィンドウ関数を使用して、最後のメッセージまたはすべてのユーザーを取得することです。

;WITH x AS 
(
  SELECT MsgId, Sender, Receiver, Contents, 
     SendTime = CONVERT(CHAR(20), SendTime, 120),
     rn = ROW_NUMBER() OVER (PARTITION BY Sender ORDER BY SendTime DESC)
  FROM dbo.tblMessage
)
SELECT MsgId, Sender, Receiver, Contents, SendTime
  FROM x
  WHERE rn = 1;

もちろん、一度に1人の送信者だけをフォローしている場合は、グループ化せずにこれを行うことができます。

SELECT TOP (1) MsgId, Sender, Receiver, Contents,
  SendTime = CONVERT(CHAR(20), SendTime, 120)
FROM dbo.tblMessage
WHERE Sender = @userName
ORDER BY SendTime DESC;
于 2013-03-26T11:34:12.847 に答える
0
SELECT TOP 1 MsgId,Sender,Receiver,Contents,convert(nvarchar(20),SendTime,120) as SendTime
FROM dbo.tblMessage
WHERE Sender=@userName
ORDER BY MsgId DESC
于 2013-03-26T11:31:55.833 に答える