在sql服务器中是否有任何优化的方法来优化此代码,我试图找到第二个重复
WITH CTE AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY id,AN_KEY ORDER BY [ENTITYID]) AS [rn]
FROM [data].[dbo].[TRANSFER]
)
select *
INTO dbo.#UpSingle
from CTE
where RN=2
答案 0 :(得分:1)
更新:
正如GurV指出的那样 - 这个问题并没有解决问题。它只会为您提供具有两个重复项的项目,但不会为您提供第二个副本所在的行。
我只想从参考目的离开这里。
原始答案
为什么不从另一个SO帖子中尝试这样的事情:Finding duplicate values in a SQL table
SELECT
id, AN_KEY, COUNT(*)
FROM
[data].[dbo].[TRANSFER]
GROUP BY
id, AN_KEY
HAVING
COUNT(*) = 2
我从原始SQL中收集到您希望分组的cols:
答案 1 :(得分:1)
以下是获取第二个重复行的另一种方法(当然按增加的ENTITYID顺序):
select *
from [data].[dbo].[TRANSFER] a
where [ENTITYID] = (
select min([ENTITYID])
from [data].[dbo].[TRANSFER] b
where [ENTITYID] > (
select min([ENTITYID])
from [data].[dbo].[TRANSFER] c
where b.id = c.id
and b.an_key = c.an_key
)
and a.id = b.id
and a.an_key = b.an_key
)
如果id,an_key和ENTITYID列都有索引,那么查询和这两者的性能都应该可以接受。
答案 2 :(得分:0)
我假设此查询可以执行您想要的操作:
WITH CTE AS (
SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY id, AN_KEY
ORDER BY [ENTITYID]) AS [rn]
FROM [data].[dbo].[TRANSFER] t
)
SELECT *
INTO dbo.#UpSingle
FROM CTE
WHERE RN = 2;
对于性能,您需要[data].[dbo].[TRANSFER](id, AN_KEY, ENTITYID)
上的复合索引。