Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Объединение почти одинаковых записей в одну на T-SQL  [new]
SiNtez_26
Member

Откуда:
Сообщений: 199
Добрый день! Есть БД в MS SQL Server и есть много таблиц, которые после всевозможных преобразований объединяются UNION'ом в одну. И может возникнуть ситуация, что на одно и то же поле INN, которое позже нужно будет вставить в итоговую таблицу, приходится несколько одинаковых значений:
INN NAME DATA PRIORITY
1 X1 A 1
1 X1 2
1 C 3

После преобразований нужно получить запись следующего вида:
INN NAME DATA PRIORITY
1 X1 A 1

При чем данные должны браться в каждое поле в соответствие с полем PRIORITY - то есть наиболее приоритетные. Интересует, возможно ли вообще такое реализовать на чистом T-SQL, и насколько все плохо будет с производительностью во время преобразований, если в таблице около миллиона строк?
1 авг 13, 12:39    [14647942]     Ответить | Цитировать Сообщить модератору
 Re: Объединение почти одинаковых записей в одну на T-SQL  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
WITH T AS
(
 SELECT * FROM T1
 UNION ALL
 SELECT * FROM T2
 ....
 UNION ALL
 SELECT * FROM Tn
)
SELECT TOP(1) WITH TIES *
FROM T
ORDER BY ROW_NUMBER()OVER(PARTITION BY INN ORDER BY PRIORITY);
Можно нумерацию оформить как ещё одно CTE
и выбрать из него записи с номером 1.
1 авг 13, 12:48    [14648031]     Ответить | Цитировать Сообщить модератору
 Re: Объединение почти одинаковых записей в одну на T-SQL  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
поля name и data берутся в соответствии с приоритетом, поле считается незаполненным если оно null, в группе не более 9999 записей
declare @t table(INN int,	NAME varchar(10),	DATA varchar(10),	PRIORITY int)
insert into @t(INN,NAME,DATA,PRIORITY)
select
1,	'X1',	'A'	,1
union all select
1,	'X1',	null,	2
union all select
1,	null,	'C',	3

;with preSel as(
select *
,ROW_NUMBER() over (partition by inn order by case when name is null then 9999 else priority end asc) name_order
,ROW_NUMBER() over (partition by inn order by case when Data is null then 9999 else priority end asc) data_order
from @t)
select *
from preSel 
where name_order = 1 and data_order =1 
1 авг 13, 12:55    [14648107]     Ответить | Цитировать Сообщить модератору
 Re: Объединение почти одинаковых записей в одну на T-SQL  [new]
SiNtez_26
Member

Откуда:
Сообщений: 199
Но в этом случае же мы получим просто запись с приоритетом 1, разве нет? А нам нужно еще и заполнить ее пустые поля значениями по приоритету, то есть если:
INN NAME DATA PRIORITY
1 1
1X1 A 2

то мы должны взять INN из первой строки, NAME из второй по приоритету (то бишь в данном случае второй) и т.д., чтобы получить:
INN NAME DATA PRIORITY
1X1A1

Если кто-то с подобным сталкивался, интересует именно возможность реализации, ну и небольшой толчок вперед)
1 авг 13, 12:58    [14648128]     Ответить | Цитировать Сообщить модератору
 Re: Объединение почти одинаковых записей в одну на T-SQL  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SiNtez_26
небольшой толчок вперед

FIRST_VALUE
1 авг 13, 13:08    [14648173]     Ответить | Цитировать Сообщить модератору
 Re: Объединение почти одинаковых записей в одну на T-SQL  [new]
сургей
Member

Откуда:
Сообщений: 5
;with t
as
(
select [inn]=1,[name]='X1',[data]='A1',[priority]=1
union all
select 1,'X1',null,2
union all
select 1,null,'c1',3
union all
select 2,'x2',null,1
union all
select 2,null,'a2',2
) 
select tn.*,tt1.name,[name_priority]=tt1.priority, tt2.data,[data_priority]=tt2.priority
from 
(select distinct inn from t) tn
 OUTER APPLY
	(select top 1 * from t ts where ts.name is not null 
	and tn.inn=ts.inn
	order by [priority] ) tt1   
 OUTER APPLY
	(select top 1 * from t ts where ts.data is not null 
	and tn.inn=ts.inn
	order by [priority] ) tt2
1 авг 13, 14:59    [14648922]     Ответить | Цитировать Сообщить модератору
 Re: Объединение почти одинаковых записей в одну на T-SQL  [new]
SiNtez_26
Member

Откуда:
Сообщений: 199
Спасибо, все прекрасно работает!
1 авг 13, 16:07    [14649345]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить