Sql 通过比较记录缩小结果集
嗨,我有一个从查询到X表的结果集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”是重复次数最多的值
1 | JOHN
2 | JOHN D
3 | JOHN D.
4 | JOHN DO
5 | JOHN DOE
6 | JOHN DD
7 | JOHN DOE.
8 | JOHNY
我需要将这个结果集缩小到这些一致性中的一个结果,我需要将最一致的记录作为有效结果。所以我认为正确的算法应该是这样的:
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(六次)。正确答案是什么?