[英]Select last row of each unique combination in SQL Server
您可以为此使用row_number()
。 传统方法是:
select m.*
from (select m.*,
row_number() over (partition by (case when senderId < receiverId then senderId else receiverId end),
(case when senderId < receiverId then receiverId else senderId end)
order by messageSentAt desc
) as seqnum
from messages m
) m
where seqnum = 1;
您也可以在不使用子查询的情况下对此进行措辞:
select top (1) with ties m.*
from messages m
order by row_number() over (partition by (case when senderId < receiverId then senderId else receiverId end),
(case when senderId < receiverId then receiverId else senderId end)
order by messageSentAt desc
);
尝试这个:
select messageId,
messageBody,
messageSentAt,
isRead
from (
select messageId,
messageBody,
messageSentAt,
isRead,
row_number() over (partition by senderId, receiverId order by messageSentAt desc) rn
from (
select messageId,
case when senderId > receiverId then senderId else receiverId end senderId,
case when senderId < receiverId then senderId else receiverId end receiverId,
messageBody,
messageSentAt,
isRead
from Messages
) a
) a where rn = 1
最内部的查询统一了发送者和接收者,因此它们的顺序无关紧要:
case when senderId > receiverId then senderId else receiverId end senderId,
case when senderId < receiverId then senderId else receiverId end receiverId,
中间查询为每行分配行号,因此第一个是最新日期。 大多数外部查询只是根据该行号进行过滤。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.