私が行っているこのレーベンシュタイン距離の計算を最適化するのに問題があります。次のことを行う必要があります。
- ソース文字列の最小距離とソース文字列のトリミングされたバージョンを含むレコードを取得します
- 最小距離のレコードを選択
- 最小距離が等しい場合 (元の距離とトリミングされた距離)、最短の距離でトリミングされたものを選択します。
- 上記の 2 つのカテゴリに該当するレコードがまだ複数ある場合は、頻度が最も高いレコードを選択します。
ここに私の作業バージョンがあります:
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)
私がここでしなければならないことは..
- 結果を一時テーブルに保存しない
- `MyTable` から 1 つだけ選択してください
- 最初の選択ステートメントからの選択で結果を正しく設定します。(selectは変数を設定し、1つの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
何か案は?