2

私が行っているこのレーベンシュタイン距離の計算を最適化するのに問題があります。次のことを行う必要があります。

  1. ソース文字列の最小距離とソース文字列のトリミングされたバージョンを含むレコードを取得します

  2. 最小距離のレコードを選択
  3. 最小距離が等しい場合 (元の距離とトリミングされた距離)、最短の距離でトリミングされたものを選択します。
  4. 上記の 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)

私がここでしなければならないことは..

  1. 結果を一時テーブルに保存しない
  2. `MyTable` から 1 つだけ選択してください
  3. 最初の選択ステートメントからの選択で結果を正しく設定します。(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 

何か案は?

4

1 に答える 1

0

あなたの試みは、元の距離であるかトリミングされた距離であるかに関係なく、作業コードが最初に距離で注文されるという点で、あなたが言うコードとは異なると思います。あなたの試みは、最初に元の距離で注文され、次にトリミングされます。

あなたがやろうとしていることを完全に理解しているかどうかはわかりませんが、次のことはあなたが必要とすることをしますか?

SELECT TOP 1
    @ResultId = ID,
    @Result = [Name],
    @ResultDist = distOrig,
    @ResultTrimmed = distTrimmed
FROM (
    SELECT
        ID, [Name], 
        dbo.Levenshtein(@Source, [Name]) As distOrig,
        dbo.Levenshtein(@SourceTrimmed, [Name])) As distTrimmed,
        Frequency
    FROM MyTable
) AS T
ORDER BY
    CASE WHEN distOrig > distTrimmed THEN distOrig ELSE distTrimmed END, -- Distance
    CASE WHEN distOrig > distTrimmed THEN 1 ELSE 0 END,                  -- Trimmed
    Frequency                                                            -- Frequency
于 2010-05-21T23:34:42.387 に答える