如何计算特定列中的单词与另一个表中的匹配单词

时间:2014-12-28 20:05:54

标签: sql sql-server tsql count

我希望能够:

  • Table1 中的 column1 中提取特定单词 - 但只从 Table2 中匹配的单词 word < < / EM>,
  • 执行已找到的单词数量的(n个)计数,
  • 将此信息放入具有格式的永久表中,如下所示:

最终

Word    | Count
--------+------
Test    |     7
Blue    |     5
Have    |     2

目前我试过这个:

INSERT INTO final (word, count) 
SELECT
  extext
  , SUM(dbo.WordRepeatedNumTimes(extext, 'test')) AS Count
FROM [dbo].[TestSite_Info], [dbo].[table_words]
WHERE [dbo].[TestSite_Info].ExText = [dbo].[table_words].Words
GROUP BY ExText;

函数dbo.WordRepeatedNumTimes是:

ALTER function [dbo].[WordRepeatedNumTimes]
(@SourceString varchar(8000),@TargetWord varchar(8000))
RETURNS int
AS
BEGIN
DECLARE @NumTimesRepeated int
,@CurrentStringPosition int
,@LengthOfString int
,@PatternStartsAtPosition int
,@LengthOfTargetWord int
,@NewSourceString varchar(8000)

SET @LengthOfTargetWord = len(@TargetWord)
SET @LengthOfString = len(@SourceString)
SET @NumTimesRepeated = 0
SET @CurrentStringPosition = 0
SET @PatternStartsAtPosition = 0
SET @NewSourceString = @SourceString

WHILE len(@NewSourceString) >= @LengthOfTargetWord
  BEGIN
    SET @PatternStartsAtPosition = CHARINDEX (@TargetWord,@NewSourceString)
    IF @PatternStartsAtPosition <> 0
    BEGIN
      SET @NumTimesRepeated = @NumTimesRepeated + 1
      SET @CurrentStringPosition = @CurrentStringPosition + @PatternStartsAtPosition + 
        @LengthOfTargetWord
      SET @NewSourceString = substring(@NewSourceString, @PatternStartsAtPosition + 
        @LengthOfTargetWord, @LengthOfString)
    END
    ELSE
    BEGIN
      SET @NewSourceString = ''
    END
  END
RETURN @NumTimesRepeated
END

当我运行上述INSERT语句时,不会插入任何记录。

在表格中, TestSite_Info 是一个名为 Extext 的列。在此列中,有随机文本 - 其中一个词是&#39; test&#39;。
在名为 Table_Words 的另一个表中,我有一个名为 Words 的列,其中一个词是&#39; Test&#39;。所以在理论上,由于这个词是匹配的,我会把它拿起来,把它放到表 Final 中,然后在单词旁边(在另一列中)计算这个单词的次数已在 TestSite_Info.Extext 中找到。

Table_Words

id|word
--+----
1 |Test
2 |Onsite
3 |Here
4 |As

TestSite_Info

ExText
-------------------------------------------------
This is a test, onsite test , test test i am here

预期的最终表已在顶部给出。

- 更新

现在我已经运行了Abecee代码块,这实际上可以用来带回一个计数列和与该单词相关的id。

结果如下:

id|total
--+----
169 |3
170 |0
171 |5
172 |7
173 |1
174 |3

取自以下提取的文字:

  

测试测试,我去了,这是一个测试,我写垃圾你好   但是我并不关心照顾和照顾,这似乎是你会看到的   四个字以及单词单词单词,但是一个。!   谁知道这里发生了什么。

正如您所看到的,ID 172的计数出现7次(作为参考,请参阅下面的ID与数字相关的内容),这是不正确的,它应该出现6次(其中添加+1为某些原因)以及ID 171这个单词护理,出现4次,但在计数上显示为5次。任何想法为什么会这样? 我真正追求的是一种方式,因为你已经非常友好地完成了显示ID和计数的表,但也在决赛桌中显示了它所涉及的单词,所以我不必通过链接回来ID表,看看实际的单词是什么。

Word|id
--+----
 as   |174
here  |173
word  |172
care  |171
hello |170
test  |169

4 个答案:

答案 0 :(得分:0)

根据我的理解,这可能会起到作用。但是,如果您发布架构

,情况会更加清晰
create table final(
  word varchar(100),
  count integer
);

insert into final (word, count) 
select column1, count(*)
from table1, table2
where table1.column1 = table2.words
group by column1;

答案 1 :(得分:0)

您可以使用更新的

WITH
Detail AS (
  SELECT
    W.id
    , W.word
    , T.extext
    , (LEN(REPLACE(T.extext, ' ', '  ')) + 2
      - LEN(REPLACE(' '
                    + UPPER(REPLACE(REPLACE(REPLACE(REPLACE(T.extext, ' ', '  '), ':', ' '), '.', ' '), ',', ' '))
                    + ' ', ' ' + UPPER(W.word) + ' ', '')) - 1
      ) / (LEN(W.word) + 2) count
  FROM Table_Words W
  JOIN TestSite_Info T
    ON CHARINDEX(UPPER(W.word), UPPER(T.extext)) > 0
)
INSERT INTO Result
SELECT
  id
  , SUM(count) total
FROM Detail
GROUP BY id
;

(忘了把前面和后面添加的空白计算在内,错过了一个符号变化,并且被空白包围的单词长度混淆了。很抱歉。感谢您测试它比我原来的更彻底!) 在SQL Server 2008上进行了测试:Updated SQL Fiddle和2012:Updated SQL Fiddle 还有with your test case

有:

  • 是纯SQL(不需要UDF),
  • 有空间进行一些调整:
    • 存储所有较低/全部大写的单词,除非大小写(需要调整建议的解决方案。)
    • 存储字符串以检查所有删除的标点符号。

请评论是否需要进一步详细说明。

答案 2 :(得分:0)

重新阅读问题描述,呈现的SELECT似乎尝试对齐/加入完整&#34; exText&#34;单词&#34;单词&#34; - 但基于平等。然后,它有&#34; exText&#34;在SELECT列表中,&#34;结果&#34;似乎在等待个别的话。 (但这不会使INSERT失败,只要该字段没有受到外键约束的保护。但由于WHERE / JOIN不太可能让任何数据通过,无论如何,这可能永远不会成为一个问题。)
对于纯声明方法的替代方法,您可能希望尝试

INSERT INTO final (word, count)
SELECT
  word
  , SUM(dbo.WordRepeatedNumTimes(extext, word)) AS Count
FROM [dbo].[TestSite_Info], [dbo].[table_words]
WHERE  CHARINDEX(UPPER([dbo].[table_words].Word), UPPER([dbo].[TestSite_Info].ExText)) > 0
GROUP BY word;

你有&#34; Word&#34;在你的&#34; Table_Words&#34;描述 - 但使用&#34; [dbo]。[table_words]。Words&#34;在WHERE条件......

答案 3 :(得分:0)

感谢您的帮助。 此解决方案的最佳方法是:

使用 细节AS(   选择     W.id     ,W.word     ,T.extext     ,(LEN(REPLACE(T.extext,'',''))+ 2        - LEN(REPLACE('''                     + UPPER(REPLACE(REPLACE(REPLACE(REPLACE(T.extext,'',''),':',''),'。',''),',',''))                     +'',''+ UPPER(W.word)+'','')) - 1       )/(LEN(W.word)+ 2)计数   FROM Table_Words W   加入TestSite_Info T.     ON CHARINDEX(UPPER(W.word),UPPER(T.extext))&gt; 0 ) 插入结果 选择   ID   ,SUM(计数)总计 从细节 GROUP BY id