首页 > 解决方案 > 过滤并保留最新的副本

问题描述

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

表 A(大约 65k 行)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

如果所有重复校验和的“状态”都相等,我想保留 CEID 最高的行。如果状态不同但校验和相等,我想保留状态 = 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。

标签: sqlsql-servertsqlsql-server-2014

解决方案


您可以使用row_number()with partition bychecksum和 order by State descand CEID 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;

推荐阅读