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

Откуда:
Сообщений: 1368
Есть список ПО, которые различаются билдами к примеру
WinPcap 4.0.2
WinPcap 4.1.1
WinPcap 4.1.2
WinPcap 4.1.3
WinRAR 4.00 (32-bit)
WinRAR 4.00 (32-разрядная)
WinRAR 4.00 (64-bit)
Lotus Notes 8.5.2
Lotus Notes 8.5.2 ru


хотелось примерно получить
WinPcap 4
WinRAR 4
Lotus Notes 8

примерно такого вида, т.е цель просто уменьшить колличество строк, не обязательно чтобы обязательно, хотя бы часть
как их можно так сгруппировать?
18 апр 13, 11:08    [14197048]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
http://msdn.microsoft.com/ru-ru/library/ms181984.aspx
18 апр 13, 11:09    [14197059]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
Glory
Member

Откуда:
Сообщений: 104751
смотрю_тут
как их можно так сгруппировать?

Распарсить на слова и группировать по нужному числу слов
18 апр 13, 11:10    [14197064]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
declare @t table (name nvarchar(200))
insert into @t (name)
values ('Win Rar 4.1'),('Win Rar 4.12'),('Win Zip 4.1'),('Win Zip 4.1.0.1'),('Win X 4.1')

   select
       ShortName = LEFT(name, PATINDEX('%[0-9]%',name))
      ,name 
      ,n = ROW_NUMBER() OVER(partition by  LEFT(name, PATINDEX('%[0-9]%',name)) order by(select 0))
   from @t

ну и дальше апдейт + делит
18 апр 13, 11:19    [14197124]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
BlackRaider
Member

Откуда: Москва (Волгоград)
Сообщений: 63
Maxx
declare @t table (name nvarchar(200))
insert into @t (name)
values ('Win Rar 4.1'),('Win Rar 4.12'),('Win Zip 4.1'),('Win Zip 4.1.0.1'),('Win X 4.1')

   select
       ShortName = LEFT(name, PATINDEX('%[0-9]%',name))
      ,name 
      ,n = ROW_NUMBER() OVER(partition by  LEFT(name, PATINDEX('%[0-9]%',name)) order by(select 0))
   from @t

ну и дальше апдейт + делит


ну и без делита и апдейта:
declare @t table (name nvarchar(200))
  insert into @t (name)
 values ('Win Rar 4.1'),('Win Rar 4.12'),('Win Zip 4.1'),('Win Zip 4.1.0.1'),('Win X 4.1')

   select ShortName = LEFT(name, PATINDEX('%[0-9]%',name))
     from @t
    group by  LEFT(name, PATINDEX('%[0-9]%',name))
18 апр 13, 12:06    [14197606]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
BlackRaider,
да как угодно по факту ,хоть в cte заверни и снеси все у чего роунумбер >1
18 апр 13, 12:20    [14197726]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
Ну тоже не совсем верно, а если в названии нет циферки, или название начинается с циферки, например "2гис"

Я тут думаю нужна таблица с полными наименованиями и с краткими, чтоб ей воспользоватся
Часть автоматом создастся, а остальное ручками
18 апр 13, 12:38    [14197883]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
смотрю_тут
Member

Откуда:
Сообщений: 1368
angel_zar
Ну тоже не совсем верно, а если в названии нет циферки, или название начинается с циферки, например "2гис"

Я тут думаю нужна таблица с полными наименованиями и с краткими, чтоб ей воспользоватся
Часть автоматом создастся, а остальное ручками

ну да , с эти столкнулся, 1с, 7z.
сейчас и union-ом их соединяю
18 апр 13, 12:45    [14197941]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
Declare @t1 table (pname varchar(50))

insert into @t1
select 'WinPcap 4.0.2'
union all 
select 'WinPcap 4.1.1'
union all 
select 'WinPcap 4.1.2'
union all 
select 'WinPcap 4.1.3'
union all 
select 'WinRAR 4.00 (32-bit)'
union all 
select 'WinRAR 4.00 (32-разрядная)'
union all 
select 'WinRAR 4.00 (64-bit)'
union all 
select 'Lotus Notes 8.5.2'
union all 
select 'Lotus Notes 8.5.2 ru'

Declare @t2 table (pname varchar(50))

insert into @t2
select 'WinPcap'
union all 
select 'WinRAR'
union all 
select 'Lotus Notes'

Select t2.pname, count(*) as Col 
from @t1 as t1 inner join @t2 as t2 on t1.pname like '%'+t2.pname+'%'
group by t2.pname


Вот пример через таблицу
18 апр 13, 12:56    [14198042]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
BlackRaider
Member

Откуда: Москва (Волгоград)
Сообщений: 63
Добавьте '%[0-9].%'
18 апр 13, 12:57    [14198052]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
BlackRaider
Member

Откуда: Москва (Волгоград)
Сообщений: 63
angel_zar, ну а смысл ? ТС как раз и хотел получить вашу же @t2. тогда проще select * from @t2 :)
18 апр 13, 12:59    [14198070]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Что то мне подсказывает, что как только вы словами опишете алгоритм требуемой группировки со всеми ньюансами, то 90 % работы будет сделано.
18 апр 13, 13:32    [14198294]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
BlackRaider
angel_zar, ну а смысл ? ТС как раз и хотел получить вашу же @t2. тогда проще select * from @t2 :)


Смысл в том что, выше предложенными способами сделать 2ую таблицу, а то что автоматом не пройдет, то руками.
Автоматом тут все точно не получится.
18 апр 13, 13:39    [14198344]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
И как обычно дисскусия в полном разгаре,а ТС пропаль
18 апр 13, 13:56    [14198428]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
смотрю_тут
Member

Откуда:
Сообщений: 1368
Maxx
И как обычно дисскусия в полном разгаре,а ТС пропаль

не, тут слежу, заодно запрос допиливаю.
Да мне нужно как раз получить таблицу t2 в запросе anger_z.
Одного ПО с версиями у меня вышло около 4000, вот уменьшаю.
Допилиливаю запрос BlackRaider
18 апр 13, 14:41    [14198703]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
BlackRaider
Member

Откуда: Москва (Волгоград)
Сообщений: 63
ну это не мой а скорее Махх запрос. точку в формат добавьте и будет вам и 1С и 7гис выбираться
18 апр 13, 14:44    [14198729]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А в вашей идеологии 'Lotus Notes 3' и 'Lotus Notes 8-8-a' должно свернуться в одну строку или остаться разными строками?
18 апр 13, 14:49    [14198777]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
Алексей Дружинин
Member

Откуда: Москва
Сообщений: 11
Блог
Если у Вас все данные похожи на данные из примера, то может подойти такое вот:

declare @App table (AppName varchar(255));
insert	@App (AppName) 
values	('WinPcap 4.0.2')
	,	('WinPcap 4.1.1')
	,	('WinPcap 4.1.2')
	,	('WinPcap 4.1.3')
	,	('WinRAR 4.00 (32-bit)')
	,	('WinRAR 4.00 (32-разрядная)')
	,	('WinRAR 4.00 (64-bit)')
	,	('Lotus Notes 8.5.2')
	,	('Lotus Notes 8.5.2 ru')
	,	('Windows 8')
	,	('.NET Framework 4.0');

; with	CTE_AppNameCut as (
			select	AppName
				,	patindex('%[0-9].%', AppName) as StringLen
			from	@App 
		)
select	distinct
		case 
			when c.StringLen > 1 then left(c.AppName, c.StringLen)
			else c.AppName 
		end as ShortAppName
from	CTE_AppNameCut as c


P.S. А если совсем сильно заморочиться, то придётся углубляться в тему подсчёта расстояния между строками и всякие тонкости fuzzy-группировок. Если интересно, для начала попробуйте хотя бы повозиться с трансформацией fuzzy grouping в SSIS
18 апр 13, 15:58    [14199297]     Ответить | Цитировать Сообщить модератору
 Re: Сгруппировать похожие наименования  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
angel_zar,

Если честно я в предыдущем посте предложил лишь вариант, вообще нужна вторая таблица не с поиском по вхождению, а с со всеми вариациями по и их коротким названием
18 апр 13, 16:43    [14199629]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить