2017-02-17 3 views
0

Есть ли оптимизированный способ в SQL Sever, чтобы optimse этого кода, я пытаюсь найти 2-й дубликатаЕсть ли оптимизированный способ в SQL Sever, чтобы optimse этого кода, я пытаюсь найти 2-ой дубликат

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, что перевалы вы хотите группу, являются:

  • Id
  • AN_KEY
+2

Неправильно. Как это нахождение второй повторяющейся строки? – GurV

+0

Вы правы, извините, это не получает повторяющуюся строку - она ​​возвращает только те элементы, которые имеют ровно два вхождения – Sanity1123

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 
     ) 

Предоставлено есть индекс по ид, an_key и столбцов EntityId, выполнение и ваш запрос, и это должно быть приемлемым.

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).

Смежные вопросы