Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 在SQLServer2005中使用MAX返回所有行而不是最后一行_Sql Server 2005 - Fatal编程技术网

Sql server 2005 在SQLServer2005中使用MAX返回所有行而不是最后一行

Sql server 2005 在SQLServer2005中使用MAX返回所有行而不是最后一行,sql-server-2005,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,

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

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

问题是您按所有列进行分组,而实际上您只想按SenderID列进行分组。下面是一种方法,使用CTE和窗口功能获取最后一条消息或每个用户:

SELECT TOP 1 MsgId,Sender,Receiver,Contents,convert(nvarchar(20),SendTime,120) as SendTime
FROM dbo.tblMessage
WHERE Sender=@userName
ORDER BY MsgId DESC
;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;