通过比较记录来缩小结果集

时间:2013-02-28 14:15:42

标签: sql oracle

嗨我有一个查询到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. 的记录中的第一个字重合
  3. 检查从左到右(DOE [两次])
  4. 的记录中的第二个字重合
  5. 确定“JOHN DOE”是最重复的值,OK

2 个答案:

答案 0 :(得分: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”。

答案 1 :(得分:0)

怎么样?

SELECT  Name
FROM    tableName
GROUP   BY Name
HAVING  COUNT(*) > 1