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. 从左到右检查记录中第一个单词是否重合(JOHN [七次])
  2. 从左到右检查记录中的第二个单词是否重合( DOE [两次] )
  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 回答