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

时间:2011-05-24 19:07:46

标签: sql sql-server database

我有一张包含1,000,000条记录的表格,我希望找到最常见的至少5个字符的子字符串。

如果我有以下条目:

KDHFOUDHGOENWFIJ 1114H4363SDFHDHGFDG
GSDLGJSLJSKJDFSG 1114H20SDGDSSFHGSLD
SLSJDHLJKSSDJFKD 1114HJSDHFJKSDKFSGG

我想在SQL中编写一个语句,选择1114H作为最常见的子字符串。我怎么能这样做?

注意:

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

2 个答案:

答案 0 :(得分:4)

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

在示例数据中,有三个字符串出现三次。 _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

结果:

Word
------
 1114

答案 1 :(得分:2)

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

http://books.google.com/books?id=wGwVkAt79bEC&pg=PA248&lpg=PA248&dq=sql+full+text+common+substring&source=bl&ots=fveHa8an08&sig=VTWHQDTA6gqSNylY9oR0mPhcP6Y&hl=en&ei=iALcTd_AB-j00gG3iZ3lDw&sa=X&oi=book_result&ct=result&resnum=1&ved=0CBoQ6AEwAA#v=onepage&q&f=false