过滤并保留最近的重复

问题描述 投票:2回答:1

请帮助我这个,我卡住了,无法弄清楚如何编写我的查询。我正在使用SQL Server 2014。

表A(约65k ROWS)CEID =主键

 CEID     State    Checksum
    1        2          666
    2        2          666
    3        2          666
    4        2          333
    5        2          333
    6        9          333
    7        9          111
    8        9          111
    9        9          741
   10        2          656

期望的输出

 CEID     State    Checksum
    3        2          666
    6        9          333
    8        9          111
    9        9          741
   10        2          656

如果所有重复校验和的“state”相等,我想保持行具有最高CEID。如果状态不同但Checksum相等,我想保持State = 9的CEID最高的行。无论状态如何,结果中都应包含CEID 9和10等唯一行。

此连接返回所有重复项:

SELECT a1.*, a2.*
FROM  tableA a1  
INNER JOIN tableA a2 ON a1.ChecksumI = a2.ChecksumI
                     AND a1.CEID <> a2.CEID  

我还使用此查询为每个重复校验和确定了MAX(CEID)

SELECT a.Checksum, a.State, MAX(a.CEID) CEID_MAX ,COUNT(*) cnt
FROM tableA a
GROUP BY a.Checksum, a.State
HAVING COUNT(*) > 1
ORDER BY a.Checksum, a.State

在第一个查询中,我无法弄清楚如何SELECT每行为具有最高CEID的行。

我遇到的问题是,当我尝试加入子查询时,子查询中不允许使用GROUP BY。

sql sql-server tsql sql-server-2014
1个回答
2
投票

你可以使用row_number()checksum的分区,并通过State descCEID desc订购。请注意,ORDER BY State desc, CEID desc可能会满足您的任何条件

并采取第一个row_number

;with 
cte as
(
    select  *, rn = row_number() over (Partition by Checksum order by State desc, CEID desc)
    from    TableA
)
select  *
from    cte
where   rn = 1
order by CEID;
© www.soinside.com 2019 - 2024. All rights reserved.