[英]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
其中
UserSenderId
和UserReceiverId
是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.