powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как объединить массивы без повторений в SQL Server?
12 сообщений из 12, страница 1 из 1
Как объединить массивы без повторений в SQL Server?
    #40058580
vv388
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В приложении надо из исходного набора данных получить новый набор, где типы это один массив значений без повторений.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
в БД данные хранятся так (Types - varchar)		
		
Id	City	Types
1	Тверь	["Cargo","TiresWheels"]
2	Тверь	["Cargo"]
3	Тверь	["Pallet","TiresWheels"]
4	Курск	["Cargo"]
5	Курск	["Pallet"]
6	Брянск	["TiresWheels"]
		
Результат должен быть таким объединить типы по городам		
		
Id	 City	 Types
1	Тверь	["Cargo","Pallet","TiresWheels"]
2	Курск	["Cargo","Pallet"]
3	Брянск	["TiresWheels"]
...
Рейтинг: 0 / 0
Как объединить массивы без повторений в SQL Server?
    #40058583
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В SQL Server нет массивов
Нормализуйте данные, и тогда подобные задачи будут решаться значительно проще.
...
Рейтинг: 0 / 0
Как объединить массивы без повторений в SQL Server?
    #40058585
vv388
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msLex
В SQL Server нет массивов
Нормализуйте данные, и тогда подобные задачи будут решаться значительно проще.

Не получится. База не наша.
Если нельзя через SQL Server, то как можно?
...
Рейтинг: 0 / 0
Как объединить массивы без повторений в SQL Server?
    #40058588
MoonRabbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
распарсить исходный набор на уникальные значения типов, пересобрать заново

вопрос только зачем так мучаться?
и как часто понадобиться этим ужасом заниматься?

но это изврат если честно
...
Рейтинг: 0 / 0
Как объединить массивы без повторений в SQL Server?
    #40058591
vv388
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MoonRabbit
распарсить исходный набор на уникальные значения типов, пересобрать заново

вопрос только зачем так мучаться?
и как часто понадобиться этим ужасом заниматься?

но это изврат если честно


Каждый час процедура будет запускаться.
Работаем с тем что есть.
...
Рейтинг: 0 / 0
Как объединить массивы без повторений в SQL Server?
    #40058598
MoonRabbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vv388
MoonRabbit
распарсить исходный набор на уникальные значения типов, пересобрать заново

вопрос только зачем так мучаться?
и как часто понадобиться этим ужасом заниматься?

но это изврат если честно


Каждый час процедура будет запускаться.
Работаем с тем что есть.


ну тогда пишите процедуру, где сперва распарсиваете поле Types и получаете набор
Id City Types
1 City1 Types1
2 City1 Types2
3 City1 Types1
4 City2 Types3

потом собираете уникальные значения из этого набора и группируйте обратно в
Id City Types
1 City1 Types1, Types2, Types3
2 City2 Types1, Types2

вешайте процедуру на job

про парсинг строки можно тут посмотреть: https://www.sql.ru/forum/953537/kak-rasparsit-stroku
все равно кошмар какой-то ))
...
Рейтинг: 0 / 0
Как объединить массивы без повторений в SQL Server?
    #40058606
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vv388
MoonRabbit
распарсить исходный набор на уникальные значения типов, пересобрать заново

вопрос только зачем так мучаться?
и как часто понадобиться этим ужасом заниматься?

но это изврат если честно


Каждый час процедура будет запускаться.
Работаем с тем что есть.


ну как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with data (Id,City,Types) as 
(select 1,	N'Тверь',	'["Cargo","TiresWheels"]'
union all select 2, N'Тверь','["Cargo"]'
union all select 3, N'Тверь','["Pallet","TiresWheels"]'
union all select 4, N'Курск','["Cargo"]'
union all select 5, N'Курск','["Pallet"]'
union all select 6, N'Брянск','["TiresWheels"]'
),
data2 as (
select 
	id
	,City
	,replace(replace(f.[value],'[',''),']','') [val]
from data d 
cross apply string_split(Types,',') f
)
select 
	row_number() over (order by (select 1/0)) [n],
	t2.City
	,quotename(stuff((select distinct ','+t1.val   as [data()] from data2 t1 where t1.City=t2.City for xml path('')),1,1,'')) [ttl]
from data2 t2
group by t2.City

...
Рейтинг: 0 / 0
Как объединить массивы без повторений в SQL Server?
    #40058621
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имо проще передать такой набор в его родную среду, т.к. написать CLR функцию, которая выполнит нужную обработку. Но это изврат полный. В базе надо хранить реляционные данные.

Если что-то помещает вот это в базу, то вы должны построить ETL процесс, которые преобразует эту кашу в нормализованные таблицы. Затем вы должны выполнить запрос и вернуть эту пользователю нужный ему набор строк. То есть "Результат должен быть таким" должно появляться только при запросе данных из базы.
...
Рейтинг: 0 / 0
Как объединить массивы без повторений в SQL Server?
    #40058630
vv388
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad
vv388
пропущено...


Каждый час процедура будет запускаться.
Работаем с тем что есть.


ну как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with data (Id,City,Types) as 
(select 1,	N'Тверь',	'["Cargo","TiresWheels"]'
union all select 2, N'Тверь','["Cargo"]'
union all select 3, N'Тверь','["Pallet","TiresWheels"]'
union all select 4, N'Курск','["Cargo"]'
union all select 5, N'Курск','["Pallet"]'
union all select 6, N'Брянск','["TiresWheels"]'
),
data2 as (
select 
	id
	,City
	,replace(replace(f.[value],'[',''),']','') [val]
from data d 
cross apply string_split(Types,',') f
)
select 
	row_number() over (order by (select 1/0)) [n],
	t2.City
	,quotename(stuff((select distinct ','+t1.val   as [data()] from data2 t1 where t1.City=t2.City for xml path('')),1,1,'')) [ttl]
from data2 t2
group by t2.City



Спасибо! То что нужно!
...
Рейтинг: 0 / 0
Как объединить массивы без повторений в SQL Server?
    #40058650
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У него Types колонка типа Json, содержащая массив строк
мой вариант запроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
WITH [Data] ([Id], [City], [Types]) AS
(
              select 1, N'Тверь', '["Cargo","TiresWheels"]'
    union all select 2, N'Тверь', '["Cargo"]'
    union all select 3, N'Тверь', '["Pallet","TiresWheels"]'
    union all select 4, N'Курск', '["Cargo"]'
    union all select 5, N'Курск', '["Pallet"]'
    union all select 6, N'Брянск','["TiresWheels"]'
),
[FullData] AS (
    SELECT DISTINCT
        City as [City], 
        t.value as [Type]
    FROM [DATA]
    CROSS APPLY OPENJSON([Types]) as t
) 
SELECT [City], Json_Query('[ "' + STRING_AGG([Type], '", "') + '"]') as [Types]
FROM [FullData]
GROUP BY [City];
...
Рейтинг: 0 / 0
Как объединить массивы без повторений в SQL Server?
    #40058665
vv388
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes
У него Types колонка типа Json, содержащая массив строк
мой вариант запроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
WITH [Data] ([Id], [City], [Types]) AS
(
              select 1, N'Тверь', '["Cargo","TiresWheels"]'
    union all select 2, N'Тверь', '["Cargo"]'
    union all select 3, N'Тверь', '["Pallet","TiresWheels"]'
    union all select 4, N'Курск', '["Cargo"]'
    union all select 5, N'Курск', '["Pallet"]'
    union all select 6, N'Брянск','["TiresWheels"]'
),
[FullData] AS (
    SELECT DISTINCT
        City as [City], 
        t.value as [Type]
    FROM [DATA]
    CROSS APPLY OPENJSON([Types]) as t
) 
SELECT [City], Json_Query('[ "' + STRING_AGG([Type], '", "') + '"]') as [Types]
FROM [FullData]
GROUP BY [City];



Спасибо! Тоже красиво

правда вот

Msg 195, Level 15, State 10, Line 42
'STRING_AGG' is not a recognized built-in function name.
...
Рейтинг: 0 / 0
Как объединить массивы без повторений в SQL Server?
    #40058668
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vv388

Спасибо! Тоже красиво

и раза в 3 быстрее

vv388

правда вот

Msg 195, Level 15, State 10, Line 42
'STRING_AGG' is not a recognized built-in function name.

поддерживается в sql2017+
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как объединить массивы без повторений в SQL Server?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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