2016-09-26 3 views
2

Я нуждаясь получить идентификатор строки из строк, которые имеют дубликатВозврат идентификатор строки, которая содержит повторяющиеся данные

Select Name from table1 group by Name having count(1) > 1 

table1

ID | Name | ClientID 
---------------------------- 
01 | John | 01 
02 | Sam  | 01 
03 | Sue  | 01 
04 | John | 02 
05 | John | 01 

единственная проблема заключается в том, что он будет возвращать только имя а не идентификатор столбца, поскольку у меня есть несколько клиентов в одной таблице, и я не хочу считать имена других клиентов как дубликаты.

Так есть способ найти дубликаты данных в таблице и вернуть идентификаторы строк, чтобы затем я мог использовать эти идентификаторы в другом запросе?

Ответ Я пошел с модифицированной

Спасибо каждый за ответы, я пошел с этим, который является модификацией, которую я помечен как ответ.

select t1.* 
from (select count(*) over (partition by entityname) as cnt ,t1.* 
     from table1 t1 where ClientID = 1 
    ) t1 
where cnt > 1 and ClientID = 1 order by cnt; 

ответ

1

Используйте функцию окна:

select t1.* 
from (select t1.*, count(*) over (partition by name) as cnt 
     from table1 t1 
    ) t1 
where cnt > 1; 

В count(*) over (partition by name) подсчитывает количество строк для каждого имени. Тем не менее, он делает это, добавляя количество в каждую строку, а не уменьшая количество строк. Это информация, необходимая для выбора строк.

+0

Ничего себе. хорошо, можете ли вы объяснить это мне? это похоже на то, что я хочу использовать, но я не могу понять, что там происходит. Спасибо. – Xaedblade

1
Select Name, min(ID) ROWID From table1 Group BY Name Having Count(ID)>1 

мин (ID) здесь будет возвращать первый раз ID появляется в двух экземплярах, и Count (ID)> 1 будет отфильтровать строки, в которых у вас есть дубликаты.

Удачи!

+0

Так это даст мне один идентификатор каждого дубликата? – Xaedblade

+0

Он будет сообщать вам, когда в списке появится Имя. Запрос возвращает одну строку для каждого имени, а столбец идентификатора строки будет содержать идентификатор, в котором идентификатор появляется в исходном файле. –

+0

Отлично! Это именно то, что я искал. спасибо – Xaedblade

0

Чтобы увидеть ссылку обманутые

Declare @Yourtable table (ID varchar(25),Name varchar(50),Client_ID varchar(25)) 
Insert into @Yourtable values 
('01','John','01'), 
('02','Sam' ,'01'), 
('03','Sue' ,'01'), 
('04','John','02'), 
('05','John','01') 

Select A.* 
     ,B.Dupes 
From @YourTable A 
Cross Apply (Select Dupes=(Select Stuff((Select Distinct ',' + cast(ID as varchar(25)) 
           From @YourTable 
           Where ID<>A.ID and Name=A.Name 
           For XML Path ('')),1,1,'') 
          ) 
      ) B 
Where Dupes is not null 

Возвращает

ID Name Client_ID Dupes 
01 John 01   04,05 
04 John 02   01,05 
05 John 01   01,04 
0

Вы можете запросить как этот

;WITH cte_duplicates 
AS (SELECT 
    id, name, client_id, 
    ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) AS rc 
FROM @Yourtable) 
SELECT 
    id, name, client_id 
FROM cte_duplicates 
WHERE rc > 1 
0

Если вы хотите fileter дублирующие, основанные как на имя и ClientId, используйте приведенный ниже запрос.

; with cte_1 
    as (select *, count(*) over (partition by name,client_id order by ID) as dups 
    from table1 ) 
Select * 
From cte_1 
where dups> 1; 
Смежные вопросы