简体   繁体   English

T-SQL Group具有独特的价值

[英]T-SQL Group By With Distinct Value

I have these tables. 我有这些表。

User : 用户

|ID|Field1....|

UserMessages : UserMessages

|ID|UserSenderId|UserReceiverId|Message|CreatedOn|

Where UserSenderId and UserReceiverId are FK of PK User.Id 其中UserSenderIdUserReceiverId是PK User.Id FK

I would like to select the first message of each conversation between users (like Facebook where on the left I see a list of users and the first chars of the last message) 我想选择用户之间每次对话的第一条消息(比如Facebook左侧我看到的是用户列表和最后一条消息的第一个字符)

I tried with this query but I have multiple results for the same couple of users 我试过这个查询,但我有同样几个用户的多个结果

SELECT DISTINCT 
    UserMessages.* 
FROM 
    UserMessages 
JOIN 
    (SELECT 
         MAX(UserMessages.Id) AS IDMAX,
         UserMessages.IdReceiver,
         UserMessages.IdSender 
     FROM 
         UserMessages 
     WHERE 
         UserMessages.IdReceiver = @UserId OR UserMessages.IdSender = @UserId 
     GROUP BY 
         UserMessages.IdReceiver, UserMessages.IdSender) IDMAX ON IDMax.IDMAX = UserMessages.Id 

Example

UserMessages : UserMessages

|ID|UserSenderId|UserReceiverId|Message|
  1|46|47|Hello
  2|47|46|Hello!
  3|46|48|Hey!!
  4|50|46|How are you?
  5|51|49| Hello 

Considering logged userid = 46, I would like to select only the messages with id 2 3 4 , where id = 2 is the last one between user 46 And 47 (logged user could be sender or receiver) 考虑到记录的userid = 46,我想只选择id为2 3 4的消息,其中id = 2是用户46和47之间的最后一个消息(记录的用户可以是发送者或接收者)

Thanks! 谢谢!

You can do this with row_number() . 你可以用row_number()来做到这一点。 The trick is to pair messages regardless of who the sender and receiver are. 诀窍是无论发送者和接收者是谁,都要配对消息。 You can do this by putting the smaller id first, then the larger id: 您可以先将较小的ID放入,然后放入较大的ID:

select um.*
from (SELECT um.*,
             row_number() over (partition by (case when idReceiver < idSender then idReceiver else idSender end),
                                             (case when idReceiver < idSender then idSender else idReceiver end)
                                order by id desc
                               ) as seqnum
     from UserMessages um
     where um.IdReceiver = @UserId OR um.IdSender = @UserId
    ) um
where seqnum = 1;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM