1

我正在尝试从 2 个类似结果(最旧的结果)中检索最后一个结果

FromUser | ToUser | Message | Date
User1    | User2  | hi      | 01/01/2013 20:00
User1    | User2  | hi later| 01/01/2013 21:00
User5    | User2  | hi      | 01/01/2013 20:01
User5    | User2  | hi later| 01/01/2013 21:01

SELECT        
    CM.FromUser, CM.ToUser, CM.Message, CM.Date, 
    U.UserId, U.UserFullName, U.UserName, U.UserPhoto
FROM
    ConversationMessages AS CM 
INNER JOIN
    Users AS U ON U.UserName = CM.FromUser
WHERE
    CM.ToUser = @user
ORDER BY 
    CM.Date DESC 

它应该首先列出用户 5 hi,然后再列出 user1 hi (用户 5 按日期更新)。只有最后一行基本上按日期分组,FromUser然后全部按日期排序。我对sql没用,在这里尝试了很多建议,但没有任何工作

4

2 回答 2

1

您想为此使用窗口函数,而不是group by

select FromUser, ToUser, Message, [Date], UserId, UserFullName, UserName, UserPhoto
from (SELECT CM.FromUser, CM.ToUser, CM.Message, CM.Date, U.UserId,
             U.UserFullName, U.UserName, U.UserPhoto,
             row_number() over (partition by CM.FromUser, CM.ToUser order by [Date] desc) as seqnum
      FROM ConversationMessages CM INNER JOIN
           Users U
           ON U.UserName = CM.FromUser
      WHERE  CM.ToUser = @user
     ) s
WHERE seqnum = 1
ORDER BY CM.Date DESC ;
于 2013-09-09T22:21:19.820 回答
1

这是您正在寻找的标准 SQL:

SELECT * FROM ConversationMessages cm1
LEFT JOIN ConversationMessages cm2
ON cm1.fromUser = cm2.fromUser AND cm1.date < cm2.date
WHERE cm2.date IS NULL AND cm1.toUser = 'User2'
ORDER BY cm1.date DESC

它应该适用于任何 DBMS。当然,请确保您替换User2为适当的 SQL Server 变量。

输出:

来自用户 | 对用户 | 留言 | 日期
用户5 | 用户2 | 你好稍后| 2013 年 1 月 1 日 21:01
用户1 | 用户2 | 你好稍后| 2013 年 1 月 1 日 21:00

在这里拉小提琴。

于 2013-09-09T22:27:03.407 回答