Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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 Server:如何在字段中找到最常见的字符串?_Sql_Sql Server_Database - Fatal编程技术网

SQL Server:如何在字段中找到最常见的字符串?

SQL Server:如何在字段中找到最常见的字符串?,sql,sql-server,database,Sql,Sql Server,Database,我有一个包含1000000+条记录的表,我想找到最常见的子字符串,至少有5个字符长 如果我有以下条目: KDHFOUDHGOENWFIJ 1114H4363SDFHDHGFDG GSDLGJSLJSKJDFSG 1114H20SDGDSSFHGSLD SLSJDHLJKSSDJFKD 1114HJSDHFJKSDKFSGG 我想在SQL中编写一条语句,选择1114H作为最常用的子字符串。我该怎么做 注意事项: 子字符串不必位于同一位置 子字符串的长度必须为5 每条记录的最大长度为50个字符

我有一个包含1000000+条记录的表,我想找到最常见的子字符串,至少有5个字符长

如果我有以下条目:

KDHFOUDHGOENWFIJ 1114H4363SDFHDHGFDG
GSDLGJSLJSKJDFSG 1114H20SDGDSSFHGSLD
SLSJDHLJKSSDJFKD 1114HJSDHFJKSDKFSGG
我想在SQL中编写一条语句,选择
1114H
作为最常用的子字符串。我该怎么做

注意事项:

  • 子字符串不必位于同一位置
  • 子字符串的长度必须为5
  • 每条记录的最大长度为50个字符

这并不能完全回答您的问题,但这里有一篇文章来自一本关于高级搜索技术的书,其中提到了一个用户定义的函数“LCS”(最长的公共子字符串),可能会有所帮助:


不需要查找最长的子字符串,因此长度大于5的每个子字符串都将始终有一个5个字符的子字符串,这是计数的依据。所以我们只需要检查长度为5的子字符串

在示例数据中,有三个字符串出现三次
\u 1114H
\u 1114
1114H
\u
用于显示空间的位置

在此解决方案中,
master..spt_值
用于代替数字表

declare @T table
(
  ID int identity,
  Data varchar(50)
)

insert into @T values
('KDHFOUDHGOENWFIJ 1114H4363SDFHDHGFDG'),
('GSDLGJSLJSKJDFSG 1114H20SDGDSSFHGSLD'),
('SLSJDHLJKSSDJFKD 1114HJSDHFJKSDKFSGG')

select top 1 substring(T.Data, N.Number, 5) as Word
from @T as T
  cross apply (select N.Number
               from master..spt_values as N
               where N.type = 'P' and
                     N.number between 1 and len(T.Data)-4) as N
group by substring(T.Data, N.Number, 5)                      
order by count(distinct id) desc
结果:

Word
------
 1114

子字符串是否必须位于所有行中字符串的相同位置?您最终需要找到所需最小长度/和/或每个子字符串出现频率的所有子字符串。这种逻辑程度在数据级别是否合适?如果你不在应用程序层面上考虑这个问题?如果它必须至少是5个字符长,那么如果数据集有任何熵,它就必须是5个字符长。在SQL中这样做并不明智,尤其是在更大的集合上。有一些非常快速的算法可以在数据库外的数据集上更快地完成这项工作。理想情况下,您可以调整LZW压缩算法的一部分,以完全实现您想要的功能–Ziv–Welchaus实际上,示例中最常见的子字符串是'1114H',长度为6个字符。为什么你没有考虑空间是子字符串的有效部分?如果我在SQL中做的话,我会把所有的有效子串从每个基本行写出到一个单独的表中,然后简单地用子串分组并计算它的实例。如果我必须处理不断变化的数据,触发器将调用SP使子字符串表与基表保持最新。另外,如果我的服务器上的应用程序试图在没有上述预处理的情况下执行此任务,我将不允许该应用程序。我想这将是一个CPU的猪,而不是我们投入生产的一般用途。从这个问题,他想找到最常见的,而不是最长的通用字符串。或者我遗漏了什么?编辑帖子删除冗余回复:5-50@hamlin11-好的。然后我删除编辑。反正我对那件事也不太满意。构建长度为5的字符串结果集可能不是很快。使用额外的交叉应用查找最长的字符串可能要慢50倍左右。