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;