繁体   English   中英

选择SQL Server中每个唯一组合的最后一行

[英]Select last row of each unique combination in SQL Server

我需要选择每个唯一组合的最后一行,而不考虑组合元素的顺序。 例如,组合(5,6)(6,5)将被视为相同的组合。

这是表格上的数据: 在此处输入图片说明

我的预期输出:

在此处输入图片说明

到目前为止,我所做的是:

Select * From
(
Select *, ROW_NUMBER() over (Partition by SenderId, ReceiverId order by MessageId desc) as Seq From Messages
) as TempTalbe Where Seq = 1

我的查询的输出是:

在此处输入图片说明

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.

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