SQL Подсчет вхождений ключевых слов документа - PullRequest
0 голосов
/ 10 февраля 2012

Я пытаюсь найти наиболее эффективный способ подсчета количества случаев, когда ключевое слово появляется в моей таблице документов, на основе определенного списка идентификаторов документов, переданных в мою хранимую процедуру.

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-гуру есть отличное решение, и любая помощь будет принята с благодарностью.

Большое спасибо M

Ответы [ 4 ]

1 голос
/ 10 февраля 2012

Вот решение для 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
0 голосов
/ 10 февраля 2012

Предполагая, что вы используете SQL Server, посмотрите на один из множества ответов для разбиения строки на отдельные строки, например Как разбить строку в T-SQL?

Тогда ваши шаги:
1. С помощью этой функции проанализируйте список соответствующих идентификаторов документов во временной таблице (@selectedDocs) (может потребоваться преобразование типов данных)
2. Заполните другую временную таблицу (@keywords) ключевыми словами, используемыми в этих документах:
insert into @keywords (docID, keyword)<br> select d.docID, ltrim(rtrim(words.s))<br> from @selectedDocs sd<br> inner join @documents d on d.docID = sd.docID<br> cross apply (select * from dbo.Split(',', d.keywords)) words<br> 3. Подсчитайте, сколько раз используется каждое ключевое слово:
select k.keyword, count(k.docID)<br> from @keywords k<br> group by k.keyword

Обратите внимание, что вы будете использовать табличную переменную, как правило, только там, где ожидаете несколько ответов или временную таблицу для большего.

0 голосов
/ 10 февраля 2012

Ask Tom , есть методика выбора из списка ключевых слов. Используя эту технику и ключевое слово GROUP BY, вы можете получить COUNT (*) это именно то, что вы ищете.

0 голосов
/ 10 февраля 2012

Я думаю, вам нужно выполнить запрос для каждого ключевого слова

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