Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Избавиться от задвоений в рекурсии / 5 сообщений из 5, страница 1 из 1
29.09.2021, 20:36
    #40100803
Earl11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от задвоений в рекурсии
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create table #t(batch varchar(50) ,s varchar(12), p varchar(12))
insert into #t values('batch1','12', '10')
insert into #t values('batch1','24', '11')
insert into #t values('batch1','36', '10')
insert into #t values('batch1','22', '25')
insert into #t values('batch1','36', '32')
insert into #t values('batch2','48', '40')
insert into #t values('batch2','60', '50')
insert into #t values('batch2','64', '56')
insert into #t values('batch3','33', '66')
insert into #t values('batch3','12', '66')



Имеется следующая рекурсия:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
select batch ,s, p
		 ,row_number() over(partition by batch order by batch) rn
  from #t
;with
t1 as 
 (select batch ,s, p
		 ,row_number() over(partition by batch order by batch) rn
  from #t
 ), 
t2 as
 (
  select batch, CAST(s as varchar(max)) [s], CAST(p as varchar(max)) [p]
		,2 [rn] 
  from t1 
  where t1.rn = 1 
  union all
  select t1.batch ,t2.s + ',' + t1.s, t2.p + ',' + t1.p
		,t2.rn + 1
  from t1  
  join t2 on t1.rn = t2.rn and t1.Batch = t2.batch 
 
 ),
 t3 as(
select batch,s, p,  
MAX(rn) over (partition by batch) mrn,rn
from t2
)
select Batch, s, p from t3
where batch in (select distinct batch from t2) and rn in (mrn)



Исходная таблица:
BATCH S Pbatch1 12 10batch1 24 11batch1 36 10batch2 48 40batch2 60 50batch2 64 56batch3 33 66batch3 12 66batch1 36 25batch1 36 32

Результат рекурсии:
BATCH S Pbatch1 12 24 36 36 36 11 10 25 32batch2 48 60 64 40 50 56batch3 33 12 66 66

Нужно сгруппировать одинаковые значения
BATCH S Pbatch1 12 24 36 11 10 25 32batch2 48 60 64 40 50 56batch3 33 12 66

Возможно ли?
...
Рейтинг: 0 / 0
29.09.2021, 20:59
    #40100807
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от задвоений в рекурсии
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
WITH
cte1 AS ( SELECT batch, s, p,
          ROW_NUMBER() OVER (PARTITION BY batch, s ORDER BY batch) rn_s, 
          ROW_NUMBER() OVER (PARTITION BY batch, p ORDER BY batch) rn_p
          FROM #t)
SELECT batch, 
       STRING_AGG(CASE WHEN rn_s = 1 THEN s END, ',') ss, 
       STRING_AGG(CASE WHEN rn_p = 1 THEN p END, ',') pp
FROM cte1 
GROUP BY batch


https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=a356bb25b4cb7f7215d39049ec40ecc1
...
Рейтинг: 0 / 0
29.09.2021, 21:01
    #40100808
Earl11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от задвоений в рекурсии
Akina, STRING_AGG не поддерживается
...
Рейтинг: 0 / 0
29.09.2021, 21:35
    #40100815
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от задвоений в рекурсии
Earl11
STRING_AGG не поддерживается
Это никак не следует из текста вопроса. Но если не поддерживает - дедовский способ через FOR XML.
...
Рейтинг: 0 / 0
30.09.2021, 09:56
    #40100883
Earl11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Избавиться от задвоений в рекурсии
Akina, как в XML? Отдельно по каждому полю?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 declare     @Batch NVARCHAR (256),
			 @s NVARCHAR (256),
			 @p NVARCHAR (256);

SET @Batch = STUFF((SELECT distinct ','+  BATCH FROM #t   FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


SET @s = STUFF((SELECT distinct ',' + s FROM #t   FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
		
SET @p = STUFF((SELECT distinct ',' + p FROM #t   FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SELECT @Batch, @s, @p 
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Избавиться от задвоений в рекурсии / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]