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

Откуда:
Сообщений: 136
есть табличка заполненная числами из 10 разрядов (1111111111)
и таблица сочетаний вхождения каждого числа (10 одинаковых категория А, 9 одинаковых категория Б, 8 одинаковых категория С, 8+2 категория В, и т.д.)
нужно определить к какой категории относится число из первой таблице по отношению ко второй таблице

пример :

число 1111111111 - категория где 10 одинаковых чисел
число 1111111112 - категория где 9 одинаковых чисел
число 1111111132 - категория где 8 одинаковых чисел
число 1111111133 - категория где 8 +2 одинаковых чисел
.........
число 1112211122 - категория где 3+2+3+2 (5+5) одинаковых чисел

какие будут идеи как это реализовать ?
20 фев 15, 19:24    [17295179]     Ответить | Цитировать Сообщить модератору
 Re: сравнение чисел  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Нормализовать, сделать группировку, выбрать группы, где больше одного числа.
20 фев 15, 19:26    [17295189]     Ответить | Цитировать Сообщить модератору
 Re: сравнение чисел  [new]
M2k
Member

Откуда:
Сообщений: 136
Гавриленко Сергей Алексеевич,
нужно определить группу каждого числа
20 фев 15, 19:28    [17295202]     Ответить | Цитировать Сообщить модератору
 Re: сравнение чисел  [new]
replace
Guest
declare @t table (id int identity, num varchar(10))

insert into @t (num)
select '1111111111' union all
select '1111111112' union all
select '1111111132' union all
select '1111111133' union all
select '1112211122 '

--select * from @t

;with cte as
(
select 0 as dig
union all
select dig+1 from cte where dig<9
)

--select id, num, dig, len(num)-len(replace(num,cast(dig as varchar),'')) as param
--from @t t cross join cte
--where len(num)-len(replace(num,cast(dig as varchar),''))>0
--order by 1

select id, num, max(len(num)-len(replace(num,cast(dig as varchar),''))) as param
from @t t cross join cte
group by id, num
order by 1

id          num        param
----------- ---------- -----------
1 1111111111 10
2 1111111112 9
3 1111111132 8
4 1111111133 8
5 1112211122 6

(5 row(s) affected)
20 фев 15, 19:50    [17295301]     Ответить | Цитировать Сообщить модератору
 Re: сравнение чисел  [new]
M2k
Member

Откуда:
Сообщений: 136
replace,
не совсем то
не правильно определены категории 4 и 5 результата 4 это 8 +2
а 5 это 3+2+3+2 или (5+5)
20 фев 15, 20:09    [17295361]     Ответить | Цитировать Сообщить модератору
 Re: сравнение чисел  [new]
replace
Guest
M2k
replace,
не совсем то
не правильно определены категории 4 и 5 результата 4 это 8 +2
а 5 это 3+2+3+2 или (5+5)

так я вам "идею" давал, как эти 10/9/8+2 получить, а дальше ж вроде понятно должно быть - тот запрос (заремленный) разделить на вашу таб.соответствий

declare @t table (id int identity, num varchar(10))

insert into @t (num)
select '1111111111' union all
select '1111111112' union all
select '1111111132' union all
select '1111111133' union all
select '1112211122 '

--select * from @t

;with cte1 as
(
	select 0 as dig
	union all
	select dig+1 from cte1 where dig<9
),
cte2 as
(
	select id, num, dig, len(num)-len(replace(num,cast(dig as varchar),'')) as param
	from @t t cross join cte1
	where len(num)-len(replace(num,cast(dig as varchar),''))>1
),
cte3 as
(
	select 'A' as cat, 10 as param
	union all
	select 'B', 9
	union all
	select 'C', 8
	union all 
	select 'C', 2
	union all
	select 'D', 8
	union all
	select 'xz', 6
	union all
	select 'xz', 4
)

select a.num, b.cat
from cte2 a inner join cte3 b on a.param=b.param
group by a.num, b.cat
having	count(*) = (select count(*) from cte2 where cte2.num=a.num)
	and	count(*) = (select count(*) from cte3 where cte3.cat=b.cat)

num        cat
---------- ----
1111111111 A
1111111112 B
1111111133 C
1111111132 D
1112211122 xz

(5 row(s) affected)

пс
M2k
а 5 это 3+2+3+2 или (5+5)

почему 5+5? 6+4 вроде ...
20 фев 15, 20:38    [17295458]     Ответить | Цитировать Сообщить модератору
 Re: сравнение чисел  [new]
M2k
Member

Откуда:
Сообщений: 136
replace,
Спасибо огромное

5 - 1112211122

111- 3 22 -2 111-3 22 - 2 или 11122 -5 и 11122 - 5
21 фев 15, 01:31    [17296343]     Ответить | Цитировать Сообщить модератору
 Re: сравнение чисел  [new]
M2k
Member

Откуда:
Сообщений: 136
replace,
не совсем корректно поставил задачу, попробую еще раз возможно так будет понятнее

есть таблица шаблонов (tab2) и таблица чисел tab1
нужно сравнить число с шаблонами и получить категорию этого числа
(формат записи шаблонов можно поменять для удобства обработки)

  
         tab1   таблица чисел
                ch (varchar(50))       category (varchar(50)) 
             ---------------    ---------------------------
             1234567899                   A
             1234567666                   B

        tab2 - шаблоны категорий 
               category varchar(50) ,    шаблон varcha(50)  
              -------------------------    -------------------
                  A                               AA                               - два одинаковых значения в числе из 10 знаков  
                  B                               AAA                             - 3 одинаковых значения  в числе из 10 знаков
                  С                               AA,BBB                       - 2 одинаковых затем 3 одинаковых значения  в числе из 10 знаков
                  D                              BBB,AA                        - 3 затем 2 одинаковых значения  в числе из 10 знаков         
                  E                               AA,BB,AAбCC           - 2 два одинаковых, числа затем 2 других одинаковых числа 
                                                                                   потом 2 любых, 2 одинаковых равных первым 2 числам 
                                                                                   и затем еще 2 одинаковых 
                                                                                   
                  F                               5(4)                     - на 5 месте значение 4
                  J                               5(4),6(2),AA         - на 5 месте значение 4 на 6 месте 2 и 2 одинаковых 
                  H                              5-6(AA)                   на 5 и 6 месте 2 одинаковых числа


      insert into tab1 select ('1234567666',  fn_category('1234567666') )



   нужна эта самая fn_category   которая возвращала бы категорию из второй таблице, сравнивая число с шаблоном 
21 фев 15, 02:21    [17296389]     Ответить | Цитировать Сообщить модератору
 Re: сравнение чисел  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
M2k
есть таблица шаблонов (tab2) и таблица чисел tab1
нужно сравнить число с шаблонами и получить категорию этого числа
Напишите на CLR функцию RegExp, храните шаблоны в её формате, и делайте с её помощью поиск.
21 фев 15, 09:46    [17296561]     Ответить | Цитировать Сообщить модератору
 Re: сравнение чисел  [new]
M2k
Member

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

CLR не подойдет так как нужно -
insert into tab1 select ('1234567666',  fn_category('1234567666') )

   нужна эта самая fn_category   которая возвращала бы категорию из второй таблице, сравнивая число с шаблоном 
21 фев 15, 13:26    [17296866]     Ответить | Цитировать Сообщить модератору
 Re: сравнение чисел  [new]
не сочтите за дерзость
Guest
M2k,

предлагаю узнать, что такое регулярки и что такое CLR. потом - возражать (или нет).

ps топик - клиника...
21 фев 15, 16:11    [17297156]     Ответить | Цитировать Сообщить модератору
 Re: сравнение чисел  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
M2k
CLR не подойдет
Почему?
21 фев 15, 20:50    [17297519]     Ответить | Цитировать Сообщить модератору
 Re: сравнение чисел  [new]
M2k
Member

Откуда:
Сообщений: 136
alexeyvg,
нужно простое решение чтоб неподготовленный человек мог изменить алгоритм работы
(не подготовленный - поверхостное знание Т-SQL)
22 фев 15, 18:07    [17299529]     Ответить | Цитировать Сообщить модератору
 Re: сравнение чисел  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
M2k
alexeyvg,
нужно простое решение чтоб неподготовленный человек мог изменить алгоритм работы
(не подготовленный - поверхостное знание Т-SQL)
Так вот для такого случая - самое то.

CLR функция RegExp - это у вас будет просто скалярная математическая функция, имеющая 2 параметра типа "строка", реализующая сравнение с шаблоном по алгоритму RegExp, её один раз написать - и можно пользоваться лет 100, она через 100 лет не устареет и переписывать её не нужно, "при изменении алгоритмов".
22 фев 15, 19:44    [17299864]     Ответить | Цитировать Сообщить модератору
 Re: сравнение чисел  [new]
M2k
Member

Откуда:
Сообщений: 136
alexeyvg,
спасибо за идею, скорее всего так и сделаю
24 фев 15, 21:54    [17307511]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить