在SQL Server 2005中使用MAX返回所有行而不是最后一行

时间:2013-03-26 11:29:03

标签: sql-server-2005

我有一个名为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

这里的问题不是获取最后一条消息,而是收到发件人发布的所有消息

2 个答案:

答案 0 :(得分: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;

当然,如果您一次只发送一个发件人,则可以在不进行分组的情况下执行此操作:

SELECT TOP (1) MsgId, Sender, Receiver, Contents,
  SendTime = CONVERT(CHAR(20), SendTime, 120)
FROM dbo.tblMessage
WHERE Sender = @userName
ORDER BY SendTime DESC;

答案 1 :(得分: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