Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2017, 16:37   #1
lnatalya
 
Регистрация: 14.04.2017
Сообщений: 8
По умолчанию совпадение значений в строке с выводом процента совпадения

Доброго времени суток!

Я не программист, но очень нужно решение для следующей задачи.
В SQL Server 2014 (возможен перевод не в SQL) есть база с данными:
ID | Категория продукта | название продукта | описание | комментарий |

Продукту может соответствовать несколько описаний, он может находится в нескольких категориях:
1 | Категория1 | продукт1 | описание1 | комментарий |
2 | Категория2 | продукт1 | описание2 | комментарий |
3 | Категория1 | продукт2 | описание3 | комментарий |
4 | Категория3 | продукт2 | описание4 | комментарий |

Описание – вариант комплектации в виде P123;654+O156;987;654+K.., где буква - код составляющей, цифры - варианты моделей через «;», например, принтер - P12345;22222;7007. Составляющих несколько (P+P+O+K+…). Необходимо в рамках одной категории найти продукты, совпадающие по комплектации более чем на 70%, с выводом процента совпадения. Совпадением считается совпадение любой модели составляющей, т.е. P12345;22222;7007 = P12345;22222;15987;47777 = P22222;60006;5555 - совпадение 1, независимо от кол-ва совпавших моделей.
Возможно рассматривать в качестве совпадения полное совпадение составляющей P12345;22222;7007 = P12345;22222;7007.


Результат желателен в виде: 1 | Категория1 | продукт1 | описание1 | комментарий | 3 | Категория1 | продукт2 | описание3 | комментарий | 72%

Буду благодарна за частичное решение либо направление для поиска.
lnatalya вне форума Ответить с цитированием
Старый 22.08.2017, 16:57   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Тому, такую структуру данных создал единица. Направление поиска - хранимые процедуры, курсоры, временные таблицы, символьные функции
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.08.2017, 16:57   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

задачка очень непростая. и не быстрая.
фактически, тут декартово произведение - каждый элемент нужно сверять с каждым.
поэтому, если в таблице есть 1000 записей, то сравнений будет 1000*1000 = миллион.
а если в исходной таблице миллион записей?


более того, что значит "процент совпадения" ?

допустим, один продукт состоит из трёх элементов 222,333,444
другой продукт состоит из пяти элементов 222, 333, 555, 777, 999
сколько здесь процент совпадения?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.08.2017, 18:30   #4
lnatalya
 
Регистрация: 14.04.2017
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Тому, такую структуру данных создал единица. Направление поиска - хранимые процедуры, курсоры, временные таблицы, символьные функции
Что есть если посоветуете, в какой вид лучше перевести, попробую это сделать.
Спасибо!

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
задачка очень непростая. и не быстрая.
фактически, тут декартово произведение - каждый элемент нужно сверять с каждым.
Когда начала разбираться сама, собиралась использовать объединение временных таблиц, в которых тема1=тема2 и ID1<ID2, чтобы убрать повторы при объединении. Но поняла, что сама буду разбираться очень долго

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
допустим, один продукт состоит из трёх элементов 222,333,444 другой продукт состоит из пяти элементов 222, 333, 555, 777, 999 сколько здесь процент совпадения?
Хороший вопрос. Пошла думать
Спасибо)

P.S. Была мысль попробовать нечеткое сравнение, дистанцию Левенштейна, понимаю, что погрешность очень большая...

Последний раз редактировалось lnatalya; 22.08.2017 в 18:42. Причина: дополнение ответа
lnatalya вне форума Ответить с цитированием
Старый 22.08.2017, 19:13   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Можно пойти таким путем - во временную таблицу выгрузить эти P123;654+O156;987;654+K в таком виде:
Категория1 Продукт1 P 123
Категория1 Продукт1 P 654
Категория1 Продукт1 O 156
Категория1 Продукт1 O 987 и т.д,
Для этого создать курсор и в цикле разобрать описание каждой записи. Ну а потом уже возможно и запросом получится, а может и нет, возможно опять курсор потребуется. В зависимости от того что же это такое тот процент
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.08.2017, 10:32   #6
lnatalya
 
Регистрация: 14.04.2017
Сообщений: 8
По умолчанию

Что если разбить составляющие на части? Разделить на столбцы, взяв их количество из максимально большой составляющей. У более коротких описаний часть из них будет пустая или «0». И сравнивать между собой, приняв за 100% большее непустое кол-во ячеек в паре (до 0/0):
|P12;34 | P111;22;555 | P333;44 |O77;888 | 0 | 0 |
|P12;34 | P12;444;666 | S222;999 | 0 | 0 | 0 |
100% - 4 ячейки
И теперь сравнивать, пары P – 0 – соответственно, не совпадают.
Если по полному совпадению, то в данной паре 25%, если по частичному (наличие любой части, ограниченной «;») – 50.
Такой вариант реализуем?

Последний раз редактировалось lnatalya; 23.08.2017 в 10:35. Причина: редактирование табл.
lnatalya вне форума Ответить с цитированием
Старый 23.08.2017, 11:00   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

я абсолютно не понимаю, что Вы за задачу решаете и зачем это Вам нужно.
но, если уж разделять, то разделять надо правильно.
нужно разделять по комплектующим, эти комплектующие писать в отдельную таблицу (можно временную/курсор, можно и просто обычную таблицу сделать).
в эту таблицу записывать
ID | ID_продукта (FK на таблицу с данными) | Ingridient

разбивать до минимальной составляющей (атома).
я предполагал, что минимальным будет
P12
P34
P111
P22
P555
O77
O888
и т.д.

потом нужна функция - ей передавать два ID_продукт
она возвращает количество совпадений составляющих (после разбиения это сделать просто)
по полученному количеству совпадений и считать процент.
ну, например,
(количество_совпавших*2 + количество_не_совпавших)/количество_составляющих_всего

формулу можно менять в зависимости от ваших потребностей
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.08.2017, 14:28   #8
lnatalya
 
Регистрация: 14.04.2017
Сообщений: 8
По умолчанию

Я подумала, что разбивать совсем мелко не стоит. Не программер я, решила, что так тоже можно.

Зачем:
Есть большое количество предметов, отличающихся нюансами составляющих. Необходимо отловить чрезмерное сходство (условно приняли более 70%), проверить и оставить «уникальные».
Например, P1;2;3 и P3;6;7 это P c 3 вариантами бантиков «белый;бежевый;молочный» и «молочный;экрю;сливочный». Цвета разные, но, по сути, это P с «беленьким» бантиком.

Спасибо за помощь, буду разбираться дальше )
lnatalya вне форума Ответить с цитированием
Старый 25.08.2017, 15:20   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от lnatalya Посмотреть сообщение
Я подумала, что разбивать совсем мелко не стоит. Не программер я, решила, что так тоже можно.
да можно как угодно, главное, чтобы задача имела чёткое и однозначное решение.

компьютер не умеет "думать" (ИИ и нейронные сети во внимание не берём).
Он чётко выполняет заложенную в него программу (алгоритм).

Вот представьте.
у вас есть бумажные карточки. на них записанные некие данные о составе.
Вы усаживаете тупого работника, который делает строго только то, что Вы ему скажете.
Вы говорите ему, возьми первую карточку выпиши на листик по строчкам эти слова.
возьми вторую карточку, подсчитай, сколько на ней есть совпадений слов (чётко - вот это и это - это совпадение, а вот это и это - нет - объясняете, как совпадение отличить от несовпадения.
теперь количество совпадений раздели на вот это число (показали, как подсчитать число, на которое надо делить).
Если в результате этого деления получилось значение больше, чем 0.7 то ты запиши номера этих карточек и результат деления в журнал.

Теперь вторую карточку откладывай в стопку, бери следующую (третью, четвёртую) карточку и повторяй, пока карточки не закончатся.
Потом выкинь первую карточку.
Возьми стопку. Возьми первую карточку и повтори весь процесс.
повторять до тех пор, пока в откладываемой стопке более одной карточки.
вот и всё.
и если Вы это сделаете, то написать программу - это уже исключительно "дело техники" - нужно просто переложить на ЯВУ этот алгоритм.


вообще ничего не понимаю...
Цитата:
Сообщение от lnatalya Посмотреть сообщение
Например, P1;2;3 и P3;6;7 это P c 3 вариантами бантиков «белый;бежевый;молочный» и «молочный;экрю;сливочный». Цвета разные, но, по сути, это P с «беленьким» бантиком.
вот, например, P1;2;3 и P3;6;7 - имеют совпадение в одном числе.
Откуда компьютер должен понять, что это "по сути, это P с «беленьким» бантиком"? если белого цвета во втором случае вообще нет!
Он (компьютер) должен сам это "понять"?!
И какой в данном случае процент совпадения? На мой взгляд 1/3 ~ 0.333 ~ 33%

ох, то ли я Вас не понимаю, то ли Вы странного хотите...

Последний раз редактировалось Serge_Bliznykov; 25.08.2017 в 15:24.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.08.2017, 17:09   #10
lnatalya
 
Регистрация: 14.04.2017
Сообщений: 8
По умолчанию

Это я невнятно объясняю )
Первоначально была мысль сравнивать по одному совпадению, т.е. если в P1;2;3 и P3;6;7 есть Р и 3, то считаем это совпадением.
В процессе поняла, что сама толком задачу не сформулировала, соответственно и не могу объяснить, что и как. Урок мне на будущее )) Но, учитывая, что только начала разбираться с sql, надеюсь на снисхождение.
Очень понятно (для тупого работника) описан процесс, по нему я и буду писать. Надеюсь, что справлюсь.
Спасибо!
lnatalya вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с выводом пустых значений zimmion PHP 2 28.07.2012 16:46
Задачи на обработку строк: удалить каждую 3-ю букву, найти кол-во гласных, кол-во цифр в строке,совпадения в 2-х строках Ирина93 Паскаль, Turbo Pascal, PascalABC.NET 6 05.11.2011 22:10
Поиск на совпадение значений chandrasecar Microsoft Office Excel 1 04.07.2010 19:22
stringgrid,сравнение двух столбцов на совпадения и не совпадения betirsolt БД в Delphi 7 19.01.2010 15:09