Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过比较记录缩小结果集_Sql_Oracle - Fatal编程技术网

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

Sql 通过比较记录缩小结果集,sql,oracle,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 我需要将这个结果集缩小到这些一致性中的一个结果,我需要将最一致的记录作为有效结果。所以我认为正确的算法应该是这样的: 从左到右检查记录中的第一个单词是否一致(JOHN[七次]) 从左到右检查记录中的第二个单词是否一致(DOE[两次]) 确定“JOHN DOE”是重复次数最多的值

嗨,我有一个从查询到X表的结果集

1 | JOHN
2 | JOHN D
3 | JOHN D.
4 | JOHN DO
5 | JOHN DOE
6 | JOHN DD
7 | JOHN DOE.
8 | JOHNY
我需要将这个结果集缩小到这些一致性中的一个结果,我需要将最一致的记录作为有效结果。所以我认为正确的算法应该是这样的:

  • 从左到右检查记录中的第一个单词是否一致(JOHN[七次])
  • 从左到右检查记录中的第二个单词是否一致(DOE[两次])
  • 确定“JOHN DOE”是重复次数最多的值,好吗
  • 这个怎么样

    SELECT  Name
    FROM    tableName
    GROUP   BY Name
    HAVING  COUNT(*) > 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
    
    我注意到“约翰”的数字是7,而不是“8”。我怀疑你不想和“约翰尼”匹配。为此,让我们添加一个附加条款:

    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”。

    您的示例是错误的-重复次数最多的值是John DO(三次)。那么,我是对的,还是你在任何情况下都需要JOHN DOE?是的,knagaev JOHN DO是最重复的值不是JOHN DOE,这是我的错误,但是这个想法是相同的,你需要让JOHN DO作为示例的结果?但是如果我们继续,正确的答案将是JOHN D(六次)。正确答案是什么?