过滤并保留最近的副本

Filter and keep most recent duplicate

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

Table 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 的行。如果状态不同但校验和相等,我想保留 State=9 的最高 CEID 的行。无论状态如何,结果中都应包含 CEID 9 和 10 等唯一行。

此加入returns所有重复项:

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。

您可以将 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;