2014-02-21 52 views
4

我有一個名爲'ticket_diary_comment'的表,其列名爲'comment_text'。該列填充了文本數據。我想獲得整個專欄中出現的所有單詞的頻率。例如:在SQL Server 2008列中出現的所有單詞的字數

Comment_Text 
I am a good guy 
I am a bad guy 
I am not a guy 

我想要什麼:

Word Frequency 
I  3 
good 1 
bad  1 
not  1 
guy  3 

請注意,我還刪除停用詞輸出。我知道計算一個特定單詞的頻率並不困難,但我正在尋找一些能夠計算列中出現的所有單詞的方法,從而消除停用詞。

我希望在這個問題上的任何形式的幫助。 我還想提一提,我必須在大數據集(大約1TB)上應用此查詢,因此性能是一個問題。

回答

3

我會使用表值函數來拆分字符串,然後將它們分組在查詢中。事情是這樣的:

SELECT item, count(1) 
FROM ticket_diary_comment 
    CROSS APPLY dbo.fn_SplitString(comment_text, ' ') 
GROUP BY item 

和定義fn_SplitString

CREATE FUNCTION [dbo].[fn_SplitString] 
( 
    @String VARCHAR(8000), 
    @Delimiter VARCHAR(255) 
) 
RETURNS 
@Results TABLE 
( 
    ID INT IDENTITY(1, 1), 
    Item VARCHAR(8000) 
) 
AS 
BEGIN 
INSERT INTO @Results (Item) 
SELECT SUBSTRING(@[email protected], num, 
    CHARINDEX(@Delimiter, @[email protected], num) - num) 
FROM Numbers 
WHERE num <= LEN(REPLACE(@String,' ','|')) 
AND SUBSTRING(@Delimiter + @String, 
      num, 
      LEN(REPLACE(@delimiter,' ','|'))) = @Delimiter 
ORDER BY num RETURN 
END 

此功能需要一個numbers table,這基本上只是​​,幷包含所有從1到10000(以上數字/更少依賴在需求上)。如果您的數據庫中已經有一個數字表,則可以用該表/列來替代您已有的數據表。

相關問題