请帮助我这个,我卡住了,无法弄清楚如何编写我的查询。我正在使用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。
你可以使用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;