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

Откуда:
Сообщений: 15
В общем есть к примеру таблица
1990 bmw door
1990 bmw bumper
1990 bmw billet grille
1991 bmw bumper
1991 bmw door
1991 bmw billet grille
1992 bmw door
1992 bmw billet grille
Задача была получить в итоге
1990, 1991 bmw bumper
1990, 1991 bmw door
1990, 1991 bmw billet grille
1992 bmw door
1992 bmw billet grille
то есть определить что в 1990 и 1991 году количество и содержание строк идентичны(за исключением года) и слепить их вместе. Для этого написал агрегат который конкатенирует и сортирует каждый столбец в пределах года, ну а потом уже по ним идет группировка. Но содержание ячеек может быть очень весомое, и количество столбцов временами большое, а по этому запрос отрабатывает не так быстро как хотелось бы. Может есть проще вариант определить, что в пределах значений указанного столбца строки идентичны? и я просто зря придумывал велосипед...
5 июн 13, 15:42    [14395332]     Ответить | Цитировать Сообщить модератору
 Re: Группировка полей  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
https://www.sql.ru/faq/faq_topic.aspx?fid=130
5 июн 13, 15:49    [14395376]     Ответить | Цитировать Сообщить модератору
 Re: Группировка полей  [new]
preslyel
Member

Откуда:
Сообщений: 15
Паганель,
как вариант, но при учете сортировки значений вряд ли у такой функции будет хоть какое-то преимущество над CLR агрегатом в быстродействии
5 июн 13, 16:08    [14395520]     Ответить | Цитировать Сообщить модератору
 Re: Группировка полей  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
preslyel
Паганель,
как вариант, но при учете сортировки значений вряд ли у такой функции будет хоть какое-то преимущество над CLR агрегатом в быстродействии

реализуйте сборку CLR и сравните. Гадать не придётся
5 июн 13, 17:01    [14395990]     Ответить | Цитировать Сообщить модератору
 Re: Группировка полей  [new]
Гость333
Member

Откуда:
Сообщений: 3683
preslyel
запрос отрабатывает не так быстро как хотелось бы

Текст запроса — секретный?
5 июн 13, 17:03    [14396004]     Ответить | Цитировать Сообщить модератору
 Re: Группировка полей  [new]
зураб касимович
Guest
preslyel,

не оно?

with t(yr, data) as
(
select 1990, 'bmw door' union all
select 1990, 'bmw bumper' union all
select 1990, 'bmw billet grille' union all
select 1991, 'bmw bumper' union all
select 1991, 'bmw door' union all
select 1991, 'bmw billet grille' union all
select 1992, 'bmw door' union all
select 1992, 'bmw billet grille'
)
select data, concat(ltrim(str([1])), ','+ltrim(str([2])), ','+ltrim(str([3])), ','+ltrim(str([4])), ','+ltrim(str([5])))
from
	(
		select yr, data, row_number() over(partition by yr order by(select 0)) as rn
		from t
	) m
	pivot (min(yr) for rn in ([1], [2], [3], [4], [5])) as d
5 июн 13, 18:03    [14396362]     Ответить | Цитировать Сообщить модератору
 Re: Группировка полей  [new]
хосе игнасио
Guest
пофиксил,

with t(yr, data) as
(
select 1990, 'bmw door' union all
select 1990, 'bmw bumper' union all
select 1990, 'bmw billet grille' union all
select 1991, 'bmw bumper' union all
select 1991, 'bmw door' union all
select 1991, 'bmw billet grille' union all
select 1992, 'bmw door' union all
select 1992, 'bmw billet grille'
)
select data, concat(ltrim(str([1])), ','+ltrim(str([2])), ','+ltrim(str([3])), ','+ltrim(str([4])), ','+ltrim(str([5])))
from
	(
		select yr, data, row_number() over(partition by data order by yr) as rn
		from t
	) m
	pivot (min(yr) for rn in ([1], [2], [3], [4], [5])) as d


bibika[lihie devyznostie]
bmw billet grille199019911992
bmw bumper19901991
bmw door199019911992
5 июн 13, 18:10    [14396392]     Ответить | Цитировать Сообщить модератору
 Re: Группировка полей  [new]
падро андриано
Guest
хосе игнасио,

К сообщению приложен файл. Размер - 11Kb
5 июн 13, 18:12    [14396406]     Ответить | Цитировать Сообщить модератору
 Re: Группировка полей  [new]
сын сестры просто марии
Guest
preslyel

автор, судя по плану - в один проход, быстро должно похать. фильтры на какие годы и прочую бижутерию навесишь сам

нужен index на поля в таком порядке create index zzz on t(data, yr);
5 июн 13, 18:20    [14396433]     Ответить | Цитировать Сообщить модератору
 Re: Группировка полей  [new]
super-code
Member

Откуда:
Сообщений: 244
preslyel,


with t(yr, data) as
(
select 1990, 'bmw door' union all
select 1990, 'bmw bumper' union all
select 1990, 'bmw billet grille' union all
select 1991, 'bmw bumper' union all
select 1991, 'bmw door' union all
select 1991, 'bmw billet grille' union all
select 1992, 'bmw door' union all
select 1992, 'bmw billet grille'
)
select t1.data,
(select CAST(yr as nvarchar(30)) + ','
from t t2 where t2.data = t1.data
for xml path(''), type).value('.', 'nvarchar(max)')
from t t1
group by data
5 июн 13, 18:29    [14396472]     Ответить | Цитировать Сообщить модератору
 Re: Группировка полей  [new]
preslyel
Member

Откуда:
Сообщений: 15
Сергей Викт.
preslyel
Паганель,
как вариант, но при учете сортировки значений вряд ли у такой функции будет хоть какое-то преимущество над CLR агрегатом в быстродействии

реализуйте сборку CLR и сравните. Гадать не придётся

Как раз сборку я сделал изначально... просто на больших объемах информации хотелось бы получить скорость работы по-выше. Думал стандартными средствами скюля может получится наворотить что-то по-оперативнее
5 июн 13, 22:24    [14397184]     Ответить | Цитировать Сообщить модератору
 Re: Группировка полей  [new]
preslyel
Member

Откуда:
Сообщений: 15
Гость333
preslyel
запрос отрабатывает не так быстро как хотелось бы

Текст запроса — секретный?

Да не секретный, просто задача намного сложнее, и чтоб не забивать всем мозг излишней информацией выделил наиболее интересующий момент. тем более, что запрос формируется динамически на стороне клиента в зависимости от количества столбцов и полей участвующих в группировке. Если конечно интересно, то скину
5 июн 13, 22:27    [14397195]     Ответить | Цитировать Сообщить модератору
 Re: Группировка полей  [new]
Тонио Лунатик
Guest
preslyel,

а что не подходит с pivot'om запрос выше? он быстро работать будет.
5 июн 13, 22:57    [14397296]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить