2014-02-21 2 views
4

'comment_text'이라는 열이있는 'ticket_diary_comment'이라는 테이블이 있습니다. 이 열은 텍스트 데이터로 채워집니다. 이 전체 열에서 발생하는 모든 단어의 빈도를 얻고 싶습니다. 예 :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 

알 수 있습니다. 특정 단어의 빈도를 계산하는 것이 어렵지는 않지만 중지 단어를 제거하는 열에 나타나는 모든 단어를 계산하는 무언가를 찾고 있습니다.

이 문제에 대한 도움을 주시면 감사하겠습니다. big-ish 데이터 세트 (약 1TB)에이 쿼리를 적용해야하므로 성능이 중요하다는 점을 말씀 드리고 싶습니다.

답변

3

테이블 값 함수를 사용하여 문자열을 분할 한 다음 쿼리에서 그룹화했습니다. fn_SplitString에 대한

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

및 정의 : 이런 식으로 뭔가

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이 필요 기본적으로 그냥 CREATE TABLE Numbers(Num int)이며, 1 만 (이상으로 모든 숫자를 포함/덜 따라 필요에 따라). DB에 숫자 테이블이 이미있는 경우 이미 가지고있는 테이블/컬럼으로 대체 할 수 있습니다.

관련 문제