Присвоение идентичного идентификатора группы идентификатору с одинаковыми значениями - Рекурсивный SQL-запрос - PullRequest
0 голосов
/ 24 июня 2018

Таблица содержит PID и соответствующие значения. PID с одинаковыми значениями должен быть присвоен одинаковый идентификатор группы. A, B, D напрямую связаны (значение = ABC), и, поскольку C связан с D (значение = GHI), A, B, C & D являются частью одной группы.

PID    Value 
--------------
A101    ABC    
A101    XYZ       
B101    ABC     
C101    GHI     
C101    DEF    
D101    ABC    
D101    GHI    
E101    KLM    
F101    MNO    

Ожидаемый результат:

PID    GroupID
--------------
A101     1       
B101     1       
C101     1     
D101     1     
E101     2  
F101     3

Я пробовал ниже запрос без успеха:

with cte as (     
select PID, Value, Rank() OVER(ORDER BY Value) rn          
from  t           
union all         
select t.PID, cte.Value, cte.rn       
from t join cte       
     on t.Value = cte.Value and              
        t.PID < cte.PID  
)           
select *      
from cte

Есть ли способ исправить запрос, а также написать более эффективный запрос (около 1 миллиона строк) в SQL Server 2012/2014?

1 Ответ

0 голосов
/ 24 июня 2018

попробуйте следующее:

declare @tab table (PID varchar(10), Val varchar(100))
insert into @tab select 'A101', 'ABC'
insert into @tab select 'A101', 'XYZ'
insert into @tab select 'B101', 'ABC'
insert into @tab select 'C101', 'GHI'
insert into @tab select 'C101', 'DEF'
insert into @tab select 'D101', 'ABC'
insert into @tab select 'D101', 'GHI'
insert into @tab select 'E101', 'KLM'
insert into @tab select 'F101', 'MNO'

select PID, dense_rank() over (order by group_id) GROUP_ID
from
(
select x.PID, min(t.num) group_id from @tab X
join (select val, dense_rank() over (order by val) num from @tab)t on t.Val = X.Val
group by x.PID
)t2
order by 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...