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

Ste*_*GSD 6 sql database sql-server

我有一个包含 1,000,000 多条记录的表,我想找到长度至少为 5 个字符的最常见子字符串。

如果我有以下条目:

KDHFOUDHGOENWFIJ 1114H4363SDFHDHGFDG
GSDLGJSLJSKJDFSG 1114H20SDGDSSFHGSLD
SLSJDHLJKSSDJFKD 1114HJSDHFJKSDKFSGG
Run Code Online (Sandbox Code Playgroud)

我想用 SQL 编写一条语句来选择1114H最常见的子字符串。我怎样才能做到这一点?

笔记:

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

Mik*_*son 4

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

在示例数据中,有 3 个字符串出现了 3 次。 _1114H_11141114H_表示空格的位置)。

在此解决方案中master..spt_values,使用数字表来代替。

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
Run Code Online (Sandbox Code Playgroud)

结果:

Word
------
 1114
Run Code Online (Sandbox Code Playgroud)