在sql服务器中是否有任何优化的方法来优化此代码,我试图找到第二个重复

时间:2017-02-17 12:10:18

标签: sql sql-server sql-server-2008

在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

3 个答案:

答案 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:

  • 编号
  • AN_KEY

答案 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)上的复合索引。