Как разработать этот алгоритм для поиска SQL?

1

Там набор значений хранится в таблице ms sql db. Эти значения указывают,

а. серийный номер изделия

б. емкость предмета

с. доступность предмета

Мне нужно создать функцию поиска, которая имеет следующие возможности и узнать элемент или комбинированные элементы, чтобы соответствовать/приближать заданную емкость,

например, заданная мощность - 8. Доступные предметы имеют емкость 10, 6, 4, 2. Есть несколько предметов с повышенной емкостью. В лучшем случае результат должен возвращать элементы с емкостью 10, прежде чем принимать решение об объединении части алгоритма. Если ни один элемент не будет удовлетворять заданной емкости, алгоритм должен продолжить объединение, но только если имеется достаточное количество элементов для объединения...

  1. Правило поиска: все комбинированные элементы должны быть смежными по серийному номеру)
  2. Комбинированная емкость должна быть точной или близкой (большей) заданной емкости
  3. Элементы должны быть доступны (проверка булевого значения)

Как мне подойти к этому? Жесткая часть может найти общую емкость комбинированных предметов, когда они смежны друг с другом. В настоящее время я думаю о каждом вытягивании данных в С# и выполнять поиск или выполнять весь поиск в SQL через хранимую процедуру. Все уши, чтобы услышать и опробовать любые предложения, которые могли бы повысить производительность и удовлетворять основным критериям.

  • 0
    Как вы определяете «рядом с серийным номером»? Если они имеют одно и то же значение, это превращается в сжато-заданный запрос, который может быть дорогим. Если они не, это становится более дорогим. Таким образом, вы, вероятно, хотите два фактических запроса, однако вы их называете. Вам нужно беспокоиться о параллельном доступе к строкам?
  • 0
    Отличный аспект @Clockwork-Muse Clockwork-Muse Ну, сейчас нет одновременного доступа. Я все еще очень скептически отношусь к "смежности" ... потому что смежно - мое правило комбинировать 2 или 3 (максимум) предмета. Вы можете предложить что-нибудь лучшее?
Показать ещё 2 комментария
Теги:
sql-server
algorithm
search

1 ответ

1

На мой взгляд, наилучшим вариантом будет хранимая процедура. Вы можете настроить его для записи в временную таблицу или переменную таблицы для первой части (идеальное или возможное совпадение, т.е.> 8), после чего вы можете проверить, чтобы увидеть количество строк в таблице temp, 0 == we не нашел его, поэтому попробуйте найти несколько элементов, которые могли бы удовлетворить совпадение.

Возможно, во второй части поиска вы можете искать элементы с числом ниже 8, но отсортированным в порядке убывания емкости. Как только вы определите тот, который имеет наивысший уровень, (позвоните ему @ok_but_not_complete_match_serialnum), тогда просто посмотрите на предметы ниже или выше этого, пока у вас не будет достаточной емкости.

Вы можете использовать несколько временных таблиц и индексов temp, чтобы все это выполнялось довольно быстро.

В запросе вы можете использовать текущие итоги Capacity, заказанные по номеру, чтобы легко идентифицировать элементы, которые будут соответствовать запросу.

Поэтому, предполагая, что серийные номера имеют заметный порядок, для второй части может работать что-то подобное

Предполагая, что @ok_but_not_complete_match_serialnum является серийным номером идентифицированного вами элемента, который имеет наивысшее (но не полное) совпадение,

select * from parts where serialnum 
between @ok_but_not_complete_match_serialnum - 10
and @ok_but_not_perfect_match_serialnum + 10 

Я выбрал 10 как произвольный диапазон выше и выше объекта, но, возможно, меньший # является желательным. Даже если запрос на текущие итоги не дает вам нужного вам, вы можете просто продолжать проверять следующий элемент serialnum, пока не удовлетворите его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню