2013-04-05 3 views
1

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

В таблице выглядит следующим образом:

material_id contstiuent_id constituent_wt_pct 
    1    1    10.5 
    1    2    89.5 
    2    1    10.5 
    2    5    15.5 
    2    7    74 
    3    1    10.5 
    3    2    89.5 

Вообще, я могу иметь различные материальные ID 'S с теми же составляющими (оба ID х и массовые проценты), но и тем же составным идентификатором с тем же весовые проценты могут быть в нескольких материалах.

Мне нужно найти материал ID «S, которые имеют точно такое же количество составных частей, одинаковые составляющие идентификаторам и те же вес процент (на примере данных, которые будут материал ID 1 и 3) Что будет велик иметь выход как:

ID Duplicate ID's
1 1,3
2 15,25
....

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

ответ

2

Построить XML-строку в CTE, которая содержит все составляющие и использовать эту строку, чтобы выяснить, какие материалы дублируются.

SQL Fiddle

сервера Настройка MS SQL 2008 схемы:

create table Materials 
(
    material_id int, 
    constituent_id int, 
    constituent_wt_pct decimal(10, 2) 
); 


insert into Materials values 
(1, 1, 10.5), 
(1, 2, 89.5), 
(2, 1, 10.5), 
(2, 5, 15.5), 
(2, 7, 74), 
(3, 1, 10.5), 
(3, 2, 89.5); 

Запрос 1:

with C as 
(
    select M1.material_id, 
     (
     select M2.constituent_id as I, 
       M2.constituent_wt_pct as P 
     from Materials as M2 
     where M1.material_id = M2.material_id 
     order by M2.constituent_id, 
       M2.material_id 
     for xml path('') 
     ) as constituents 
    from Materials as M1 
    group by M1.material_id 
) 
select row_number() over(order by 1/0) as ID, 
     stuff((
     select ','+cast(C2.material_id as varchar(10)) 
     from C as C2 
     where C1.constituents = C2.constituents 
     for xml path('') 
     ), 1, 1, '') as MaterialIDs 
from C as C1 
group by C1.constituents 
having count(*) > 1 

Results:

| ID | MATERIALIDS | 
-------------------- 
| 1 |   1,3 | 
+0

Микаэл, спасибо. В результате вы получили идентификаторы составляющих с соответствующим процентным процентом и материалами, которые они использовали. Мне нужно получить почти обратный результат - таблицу, которая будет иметь 2 столбца: 1 - номер строки (id), 2 - разделенные запятыми идентичные идентификаторы материала (т. Е. Имеющие одинаковые составляющие и одинаковый весовой процент для каждого из них) – user2250303

+0

@ user2250303 ОК, я думаю, что знаю, чего ты хочешь здесь. Вы хотите найти материалы, в которых есть те же самые компоненты в них? Как найти все одинаковые рецепты для выпечки торта, где торт. Так, как я думаю, это тот же материал, что и ваш мир, а составляющая - ингредиенты. –

+1

+1 для более (заказать 1/0) –

0

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

Select EMP_NAME as NameT,count(EMP_NAME) as DuplicateValCount From dbo.Emp_test 
group by Emp_name having count(EMP_NAME) > 1 
Смежные вопросы