过滤并保留最近的副本
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 desc
和 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;
请帮我解决这个问题,我被卡住了,无法弄清楚如何编写我的查询。我正在使用 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 desc
和 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;