簡體   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