SQL计算文档关键字的出现次数

时间:2012-02-10 15:17:52

标签: sql sql-server-2008 loops count keyword

我正在尝试找出最有效的方法,根据传入我的存储过程的特定文档ID列表,计算关键字在文档表中出现的次数。

SP将参数@DocIds作为逗号分隔列表,例如100,2010,2340

我想要做的是在我传入的逗号分隔列表中选择DocID所在的记录,并将关键字记录到临时表中,但如果关键字已经添加到我的临时表中也要保持计数表

例如(文件表):

DocID | Keywords
-----------------------------
100   | Test, Document, Info
2010  | Document, users
4     | ....    
2340  | users, client  

临时表将返回:

Keyword  | Count
Test     | 1
Document | 2
Info     | 1  
users    | 2
client   | 1

我确信一些SQL大师有一个很好的解决方案,非常感谢任何帮助。

非常感谢 中号

4 个答案:

答案 0 :(得分:1)

这是SQL Server 2005+的解决方案。它使用递归CTE来产生单词计数

示例数据和临时表创建

CREATE Table #Temp ([Count] int, Keyword varchar(max) );

DECLARE @document AS TABLE ( 
  docid    INT, 
  keywords VARCHAR(MAX)) 

INSERT INTO @document 
VALUES      (100, 'Test, Document, Info'), 
            (2010, 'Document, users'), 
            (4, '....'), 
            (2340, 'users, client')

查询

 ; WITH cte(docid, word, keywords) 
         AS (SELECT docid, 
                    LEFT(keywords, Charindex(',', keywords + ',') - 1), 
                    Stuff(keywords, 1, Charindex(',', keywords + ','), '') 
             FROM   @document 
             UNION ALL 
             SELECT docid, 
                    LEFT(keywords, Charindex(',', keywords + ',') - 1), 
                    Stuff(keywords, 1, Charindex(',', keywords + ','), '') 
             FROM   cte 
             WHERE  keywords > '') 
    INSERT INTO #Temp ([Count], Keyword)
    SELECT COUNT(docid), 
           Ltrim(Rtrim(word)) 
    FROM   cte 
    GROUP  BY Ltrim(Rtrim(word)) 

    SELECT [Count], Keyword FROM #temp

输出

Count       Keyword
--------    -----
1           ....
1           client
2           Document
1           Info
1           Test
2           users

答案 1 :(得分:0)

我认为您必须为每个关键字运行查询

INSERT INTO tmp VALUES ('users',(
   SELECT COUNT(DocID) FROM Documents WHERE keywords LIKE '%users%')
)

答案 2 :(得分:0)

Ask Tom,有一种从关键字列表中选择的技巧。 使用该技术和GROUP BY关键字,您可以获得COUNT(*) 这正是你要找的。

答案 3 :(得分:0)

假设您正在使用SQL Server,请查看将字符串拆分为单个行的众多答案之一,例如How to split a string in T-SQL?

然后你的步骤是:
1.使用此函数将相关文档列表的列表解析为临时表(@selectedDocs)(可能需要数据类型转换)
2.使用这些文档使用的关键字填充另一个临时表(@keywords):
insert into @keywords (docID, keyword)
select d.docID, ltrim(rtrim(words.s))
from @selectedDocs sd
inner join @documents d on d.docID = sd.docID
cross apply (select * from dbo.Split(',', d.keywords)) words
3.计算每个关键字的使用次数:
select k.keyword, count(k.docID)
from @keywords k
group by k.keyword

请注意,您通常只在需要一些答案的地方或临时表中使用表变量。