powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Избавиться от задвоений в рекурсии
5 сообщений из 5, страница 1 из 1
Избавиться от задвоений в рекурсии
    #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
Избавиться от задвоений в рекурсии
    #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
Избавиться от задвоений в рекурсии
    #40100808
Earl11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, STRING_AGG не поддерживается
...
Рейтинг: 0 / 0
Избавиться от задвоений в рекурсии
    #40100815
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Earl11
STRING_AGG не поддерживается
Это никак не следует из текста вопроса. Но если не поддерживает - дедовский способ через FOR XML.
...
Рейтинг: 0 / 0
Избавиться от задвоений в рекурсии
    #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
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Избавиться от задвоений в рекурсии
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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