У меня проблемы с оптимизацией этого вычисления расстояния Левенштейна, которое я делаю.Мне нужно сделать следующее:
- Получить запись с минимальным расстоянием для исходной строки, а также урезанную версию исходной строки
- Выбрать запись с минимальным расстоянием
- Если минимальные расстояния равны (оригинал и усеченный), выберите усеченную с наименьшим расстоянием
- Если все еще есть несколько записей, которые подпадают под две вышеуказанные категории, выберите ту, у которойсамая высокая частота
Вот моя рабочая версия:
DECLARE @Results TABLE
(
ID int,
[Name] nvarchar(200),
Distance int,
Frequency int,
Trimmed bit
)
INSERT INTO @Results
SELECT ID,
[Name],
(dbo.Levenshtein(@Source, [Name])) As Distance,
Frequency,
'False' As Trimmed
FROM
MyTable
INSERT INTO @Results
SELECT ID,
[Name],
(dbo.Levenshtein(@SourceTrimmed, [Name])) As Distance,
Frequency,
'True' As Trimmed
FROM
MyTable
SET @ResultID = (SELECT TOP 1 ID FROM @Results ORDER BY Distance, Trimmed, Frequency)
SET @Result = (SELECT TOP 1 [Name] FROM @Results ORDER BY Distance, Trimmed, Frequency)
SET @ResultDist = (SELECT TOP 1 Distance FROM @Results ORDER BY Distance, Trimmed, Frequency)
SET @ResultTrimmed = (SELECT TOP 1 Trimmed FROM @Results ORDER BY Distance, Trimmed, Frequency)
Я считаю, что мне нужно сделать здесь, чтобы ..
- Не тупойрезультаты во временную таблицу
- Делайте только 1 выбор из `MyTable`
- Установка результатов прямо в операции выбора из первоначального оператора выбора.(Так как select установит переменные, и вы можете установить несколько переменных в одном операторе select)
Я знаю, что должна быть хорошая реализация этого, но я не могу понять это ... этонасколько я понял:
SELECT top 1 @ResultID = ID,
@Result = [Name],
(dbo.Levenshtein(@Source, [Name])) As distOrig,
(dbo.Levenshtein(@SourceTrimmed, [Name])) As distTrimmed,
Frequency
FROM
MyTable
WHERE /* ... yeah I'm lost */
ORDER BY distOrig, distTrimmed, Frequency
Есть идеи?