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

Откуда: Империя Добра
Сообщений: 37076
Например есть две строки

abcd1223 3455abcd000

нужно что бы функция выдавала 1 если во второй строке есть подряд расположенные любые 4 символа которые также есть в первой строке

пока нашел из встроенных функций DIFFERENCE и SOUNDEX, но это не то
25 июн 14, 12:32    [16216683]     Ответить | Цитировать Сообщить модератору
 Re: как найти неполные соответствия?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Wizandr,

а в первой строке тоже подряд?

В общем случае это задача нечёткого поиска.
У нас тут Mnior специалист по этому делу.
Хорошая идея - поискать соответствующие темы на этом форуме.
25 июн 14, 12:38    [16216746]     Ответить | Цитировать Сообщить модератору
 Re: как найти неполные соответствия?  [new]
Wizandr
Member

Откуда: Империя Добра
Сообщений: 37076
iap
Wizandr,

а в первой строке тоже подряд?

В общем случае это задача нечёткого поиска.
У нас тут Mnior специалист по этому делу.
Хорошая идея - поискать соответствующие темы на этом форуме.

да
в первой строке то же подряд

нужно также уточнить, что в приведенном примере не ровно 4 , а минимум 4 символа
25 июн 14, 12:45    [16216833]     Ответить | Цитировать Сообщить модератору
 Re: как найти неполные соответствия?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Wizandr
iap
Wizandr,

а в первой строке тоже подряд?

В общем случае это задача нечёткого поиска.
У нас тут Mnior специалист по этому делу.
Хорошая идея - поискать соответствующие темы на этом форуме.

да
в первой строке то же подряд

нужно также уточнить, что в приведенном примере не ровно 4 , а минимум 4 символа


Какое число строк надо сравнить и какие длины ожидаются?
25 июн 14, 13:01    [16216979]     Ответить | Цитировать Сообщить модератору
 Re: как найти неполные соответствия?  [new]
Wizandr
Member

Откуда: Империя Добра
Сообщений: 37076
a_voronin
Wizandr
пропущено...

да
в первой строке то же подряд

нужно также уточнить, что в приведенном примере не ровно 4 , а минимум 4 символа


Какое число строк надо сравнить и какие длины ожидаются?


строк несколько десятков тысяч, длина в пределах сотни символов
понятное дело что перебором на tsql написать можно
но может есть готовое решение
25 июн 14, 13:09    [16217026]     Ответить | Цитировать Сообщить модератору
 Re: как найти неполные соответствия?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Если писать перебор, то на уровне C# или C++. Можно SSIS. Я бы написал утилиту или блок в C# код в SSIS. При большом объеме C++

Процессор может делать несколько миллиардов сравнений в секунду.

Строковые операции на SQL SERVER вещь медленная

А есть ли у данных какие-то особенности позволяющие снизить перебор?
25 июн 14, 13:19    [16217093]     Ответить | Цитировать Сообщить модератору
 Re: как найти неполные соответствия?  [new]
Wizandr
Member

Откуда: Империя Добра
Сообщений: 37076
a_voronin
Если писать перебор, то на уровне C# или C++. Можно SSIS. Я бы написал утилиту или блок в C# код в SSIS. При большом объеме C++

Процессор может делать несколько миллиардов сравнений в секунду.

Строковые операции на SQL SERVER вещь медленная

А есть ли у данных какие-то особенности позволяющие снизить перебор?

особенности есть
приведенные цифры уже с учетом особенностей
25 июн 14, 13:23    [16217124]     Ответить | Цитировать Сообщить модератору
 Re: как найти неполные соответствия?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Wizandr
a_voronin
Если писать перебор, то на уровне C# или C++. Можно SSIS. Я бы написал утилиту или блок в C# код в SSIS. При большом объеме C++

Процессор может делать несколько миллиардов сравнений в секунду.

Строковые операции на SQL SERVER вещь медленная

А есть ли у данных какие-то особенности позволяющие снизить перебор?

особенности есть
приведенные цифры уже с учетом особенностей


По идеи C# или С++ код полный перебор прогонит за десятки минут. Посмотрите, погуглите код готовый для этих алгоритмов

http://habrahabr.ru/post/114997/
25 июн 14, 13:56    [16217299]     Ответить | Цитировать Сообщить модератору
 Re: как найти неполные соответствия?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Wizandr, встроенных функций нет.

Бьете все строки кусками по 4 символа в отдельную таблицу, потом делаете селект по таблице по равенству кусков и разнице строк.
25 июн 14, 14:05    [16217379]     Ответить | Цитировать Сообщить модератору
 Re: как найти неполные соответствия?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Minamoto
Wizandr, встроенных функций нет.

Бьете все строки кусками по 4 символа в отдельную таблицу, потом делаете селект по таблице по равенству кусков и разнице строк.


На уровне SQL очень долго. Если написать CLR функцию сравнения двух строк, то может ещё терпимо будет.
25 июн 14, 14:11    [16217429]     Ответить | Цитировать Сообщить модератору
 Re: как найти неполные соответствия?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
a_voronin, вот POC на рандомных данных - 10.000 строк по 108 символов.

Сделал count(*), чтобы не тащить на клиент все строки - нашлось 24.033.627 пересечений строк.

Время выполнения на моем сервере: 14 минут. Как по мне, так приемлемо для такого объема перебора, учитывая, что нет индексов.

with randomdata
as
(
	select cast(NEWID() as nvarchar(36)) + cast(NEWID() as nvarchar(36)) + cast(NEWID() as nvarchar(36)) as randtext
	from	master.dbo.spt_values t1
			cross join master.dbo.spt_values t2
	where	t1.type = 'P' and t1.number < 10
		and t2.type = 'P' and t2.number < 1000
),
ntiles as
(
	select SUBSTRING(randtext, 1, 4) as nt, right(randtext, len(randtext) -1) as resttext, randtext
	from randomdata
	where LEN(randtext) >=4
	union all
	select SUBSTRING(resttext, 1, 4), right(resttext, len(resttext) -1) as resttext, randtext
	from ntiles
	where LEN(resttext) >=4
),
result as
(
	select distinct n1.randtext r1, n2.randtext r2
	from ntiles n1
		inner join ntiles n2 
				on n1.nt = n2.nt
	where n1.randtext != n2.randtext
)
select COUNT(*) from result
option (maxrecursion 0)
25 июн 14, 17:55    [16219113]     Ответить | Цитировать Сообщить модератору
 Re: как найти неполные соответствия?  [new]
zasandator
Member [скрыт] [заблокирован]

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

Так не катит?
declare
    @s1 varchar(100) = 'abcd1223',
    @s2 varchar(100) = '3455abcd000',
    @q int = 4

;with cte(part, strn) as
(
    select left(@s1,@q), stuff(@s1,1,1,'')
    union all
    select left(strn,@q), stuff(strn,1,1,'')
    from cte where len(strn) >= @q
)
select part
from cte
where @s2 like '%'+part+'%'
26 янв 15, 19:30    [17173218]     Ответить | Цитировать Сообщить модератору
 Re: как найти неполные соответствия?  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Wizandr,
--любые 4 символа которые также есть в первой строке

поиск аминокислот?
26 янв 15, 20:16    [17173399]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить