SQL统计文档关键字的出现次数
我正试图找到一种最有效的方法,根据传递到存储过程中的特定文档ID列表,计算关键字在文档表中出现的次数 SP将参数@DocIds作为逗号分隔的列表,例如10020102340 我想做的是选择DocID存在于我要传递的逗号分隔列表中的记录,并将关键字记录到临时表中,但如果关键字已添加到我的临时表中,则还要保留一个计数 例如,文档表:SQL统计文档关键字的出现次数,sql,sql-server-2008,loops,count,keyword,Sql,Sql Server 2008,Loops,Count,Keyword,我正试图找到一种最有效的方法,根据传递到存储过程中的特定文档ID列表,计算关键字在文档表中出现的次数 SP将参数@DocIds作为逗号分隔的列表,例如10020102340 我想做的是选择DocID存在于我要传递的逗号分隔列表中的记录,并将关键字记录到临时表中,但如果关键字已添加到我的临时表中,则还要保留一个计数 例如,文档表: DocID | Keywords ----------------------------- 100 | Test, Document, Info 2010 |
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专家对此有一个很好的解决方案,任何帮助都将不胜感激
非常感谢
M我认为您必须为每个关键字运行一个查询
INSERT INTO tmp VALUES ('users',(
SELECT COUNT(DocID) FROM Documents WHERE keywords LIKE '%users%')
)
,具有从关键字列表中进行选择的技术。
使用这种技术和关键字分组,您可以获得计数*
这正是您想要的。这里有一个针对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')
质疑
输出
Count Keyword
-------- -----
1 ....
1 client
2 Document
1 Info
1 Test
2 users
假设您使用的是SQL Server,请查看将字符串拆分为单独行的众多答案之一,例如 那么你的步骤是: 1.使用此功能将相关文档ID列表解析为临时表@selectedDocs,可能需要进行数据类型转换 2.用这些文档使用的关键字填充另一个临时表@keywords: 插入@keywords docID,关键字 选择d.docID,ltrimrtrimwords.s 从@selectedDocs sd d.docID=sd.docID上文档d的内部联接 交叉应用select*from dbo.Split',',d.words关键字 3.计算每个关键字的使用次数: 选择k.keyword,countk.docID 来自@k关键字 按k关键字分组
请注意,您通常只在需要一些答案的地方使用表变量,或者在需要更多答案的地方使用临时表变量 您应该包括数据库和版本,因为解析逗号分隔字段的解决方案高度依赖于此。很好的调用-我使用的是SQL Server 2008感谢您的输入dude-我应该如上所述提到我使用的是SQL Server 2008
Count Keyword
-------- -----
1 ....
1 client
2 Document
1 Info
1 Test
2 users