0

こんにちは、クエリから X テーブルへのこの結果セットがあります

1 | JOHN
2 | JOHN D
3 | JOHN D.
4 | JOHN DO
5 | JOHN DOE
6 | JOHN DD
7 | JOHN DOE.
8 | JOHNY

この結果セットを、最も一致したレコードを有効な結果として取得する必要があるこの一致の中で 1 つの結果だけに絞り込む必要があります。したがって、これに対する正しいアルゴリズムは次のようになると思いました。

  1. レコード間で最初の単語の一致を左から右にチェック ( JOHN [7 回])
  2. 左から右へのレコード間で 2 番目の単語の一致をチェックします ( DOE [2 回] )
  3. 「JOHN DOE」が最も繰り返される値であると判断し、OK
4

2 に答える 2

1

うーん、これは計算コストが高いです。私がとるアプローチは、フィールドを自己結合して、各フィールドの重複を他のフィールドと比較することです。

select x.name, count(*)
from x cross join
     x x2
where left(x.name, length(x.name)) = left(x2.name, length(x.name))
group by x.name
order by count(*) desc

「John」のカウントが「8」ではなく 7 になっていることに気付きました。「Johny」と一致させたくないのではないかと思います。そのために、追加の句を追加しましょう。

select x.name, count(*)
from x cross join
     x x2
where left(x.name, length(x.name)) = left(x2.name, length(x.name)) and
      (length(x.name = x2.name) or substr(x2.name, length(x.name)+1, 1) = ' ')
group by x.name
order by count(*) desc

これが機能するためには、データに「最短」バージョンがあると想定しています。したがって、「John」がデータ行でない場合、「John」は検索されません。

于 2013-02-28T14:19:54.147 に答える
0

これはどう?

SELECT  Name
FROM    tableName
GROUP   BY Name
HAVING  COUNT(*) > 1
于 2013-02-28T14:18:29.927 に答える