sql - 过滤并保留最新的副本
问题描述
请帮我解决这个问题,我被卡住了,无法弄清楚如何编写我的查询。我正在使用 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。
解决方案
您可以使用row_number()
with partition bychecksum
和 order by State desc
and 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;
推荐阅读
- express - 基于 Auth0 范围授权 FeathersJs 服务
- sql - 在 SQL Server 中对一种类型的数据进行分组
- python - 根据字符串列表过滤熊猫中的数据框
- google-apps-script - 将一列中的数据与一行中的数据进行比较并写入相应列的脚本
- mips - 在哪个管道阶段做出分支决策?
- image - 香蕉病害植物的叶子图像/数据集
- javascript - 可点击的 2 div 和图例形式
- c# - 如何在 SQL 中执行此 EF Core 嵌套日期比较查询
- swift - UIView.transition 后单元格的结构被破坏
- json - 如何将自定义属性添加到 Laravel 分页 json 响应