如何在MSSQL中仅获取每个对话的最后一条消息

时间:2018-09-05 11:07:02

标签: sql sql-server tsql

当您可以与其他用户交谈时,我正在尝试制作一个简单的Messenger应用程序,但是在尝试在MSSQL中创建查询以获取与其他用户的所有对话但仅包含最后一条消息的查询时,我遇到了一些问题将在决定用户要进入哪个会话并阅读所有消息之前向用户显示。

我有一张这样的桌子

ID      FromUserId      ToUserId        Message             SentDate                        Seen
1           32              35        HEY               2018-01-01 01:02:01         False
2           35              32        How are you       2018-01-01 01:02:07         False
3           32              36        HELLO             2018-01-01 17:00:22         False
4           37              32        Hey Buddy         2018-01-01 17:05:22         False

我想要得到的结果看起来像这样:

ID      FromUserId      ToUserId        Message             SentDate                        Seen
4           37              32        Hey Buddy         2018-01-01 17:05:22         False
3           32              36        HELLO             2018-01-01 17:00:22         False
2           35              32        How are you       2018-01-01 01:02:07         False

所以最后一次对话是与用户37进行的,最后一条消息是Hey Buddy,时间为2018年1月1日17:05:22 然后与用户36和HELLO在2018-01-01 17:00:22 然后与用户37一起发送最后一条消息,您好吗,2018年1月1日01:02:03

我需要类似的条件,例如在查询中传递userid时,它将检查useridFromUserId中的所有ToUserId消息。

2 个答案:

答案 0 :(得分:1)

使用row_number()

select * from 
(select ID,FromUserId ,ToUserId,Message,SentDate,Seen,
row_number() over (partition by FromUserId order by sentdate desc) as rn
from tablename) a where rn=1

答案 1 :(得分:1)

使用row_number()函数:

select t.*
from (select t.*, row_number() over (partition by FromUserId order by SentDate desc) as seq
      from table t
     ) t
where seq = 1;