2011-10-06 7 views
1

誰かがこれを行ったかどうかを調べるための探索的な質問です。実際は可能です。TSQL - タグクラウドの一般的な単語を引き出すためにテーブルの列を照会する

タグクラウドが何であるかはわかっていますが、通常、タグクラウドはタグを割り当てる誰かによって作成されます。可能なのは、SQL Serverの現在の機能の中で、テーブルをレコードが追加または更新されたときに、特定の列内のデータを参照して一般的な単語を取得することによって、これを自動的に作成することです。

この質問に似ています:How can I get the most popular words in a table via mysql?。しかし、MySQLはMSSQLではありません。

ありがとうございます。ここで ジェームズ

+1

を。文字列を受け取り、単語の表を出力するテーブル値関数を作成すると、 'myData CROSS APPLY myFunction(myTable.sentance)'を使用してGROUP BYを使ってすべてを数えることができます。文章を個々の言葉に分解するために必要な規則は、あなたや他の人に任せます:) – MatBailie

答えて

6

は、行に区切られた文字列を解析するには良いビットです:
http://anyrest.wordpress.com/2010/08/13/converting-parsing-delimited-string-column-in-sql-to-rows/

http://www.sqlteam.com/article/parsing-csv-values-into-multiple-rows

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648

T-SQL: Opposite to string concatenation - how to split string into multiple records

あなたはすべての単語を解析したい場合は、あなたがすることができますあなたの区切り文字としてスペース ''を使用すると、各単語の行が得られます。あなたは、単に結果を選択することになる

次は言葉でGROUP INGを設定し、COUNT

注文あなたの結果を集約し、あなたがそこにいます。

+0

正確に私が必要としてくれたこと、ありがとう。私たちは物事のパフォーマンス面で何を見ていますか? – jamesmhaley

+0

@ sparkyfiedパフォーマンスはかなり悪いです。複数の行があり、それぞれを一時テーブルにパースしている場合は、カーソルにしばらく時間がかかることがあります。幸いにも、タグクラウドを非常に頻繁に生成する必要はありません。 – Matthew

+0

管理者がレコードを追加したり、行を更新したりするときに最適なオプションはトリガーですか? – jamesmhaley

1

IMOでは、このアプローチが困難です。ユーザーがタグを割り当てることを許可したからといって、タグを単語の単一の区切りリストとして格納する必要はありません。今、あなたの質問は些細なり

Create Table Posts (Id ... not null primary key) 
Create Table Tags(Id ... not null primary key, Name ... not null Unique) 
Create Table PostTags 
    (PostId ... not null References Posts(Id) 
    , TagId ... not null References Tags(Id)) 

:あなたのような何かに構造を正常化することができます

Select T.Id, T.Name, Count(*) As TagCount 
From PostTags As PT 
    Join Tags As T 
     On T.Id = PT.TagId 
Group By T.Id, T.Name 
Order By Count(*) Desc 

あなたが区切られた値として、タグを保存することを主張した場合、その後、唯一の解決策は、彼らの区切り文字に値を分割することですカスタムSplit関数を記述してカウントします。一番下はSplit関数の例です。それをあなたのクエリは、(カンマ区切り文字を使用して)次のようになります。

Select Tag.Value, Count(*) As TagCount 
From Posts As P 
    Cross Apply dbo.Split(P.Tags, ',') As Tag 
Group By Tag.Value 
Order By Count(*) Desc 

Split関数:あなたは言葉のセットにそれぞれ一文に含まを変換するために、文字列操作を使用する必要があるだろう

Create Function [dbo].[Split] 
( 
    @DelimitedList nvarchar(max) 
    , @Delimiter nvarchar(2) = ',' 
) 
RETURNS TABLE 
AS 
RETURN 
    (
    With CorrectedList As 
     (
     Select Case When Left(@DelimitedList, DataLength(@Delimiter)/2) <> @Delimiter Then @Delimiter Else '' End 
      + @DelimitedList 
      + Case When Right(@DelimitedList, DataLength(@Delimiter)/2) <> @Delimiter Then @Delimiter Else '' End 
      As List 
      , DataLength(@Delimiter)/2 As DelimiterLen 
     ) 
     , Numbers As 
     (
     Select TOP (Coalesce(Len(@DelimitedList),1)) Row_Number() Over (Order By c1.object_id) As Value 
     From sys.objects As c1 
      Cross Join sys.columns As c2 
     ) 
    Select CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen As Position 
     , Substring (
        CL.List 
        , CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen  
        , Case 
         When CharIndex(@Delimiter, CL.list, N.Value + 1)        
          - CharIndex(@Delimiter, CL.list, N.Value) 
          - CL.DelimiterLen < 0 Then Len(CL.List) 
         Else CharIndex(@Delimiter, CL.list, N.Value + 1)        
          - CharIndex(@Delimiter, CL.list, N.Value) 
          - CL.DelimiterLen 
         End 
        ) As Value 
    From CorrectedList As CL 
     Cross Join Numbers As N 
    Where N.Value < Len(CL.List) 
     And Substring(CL.List, N.Value, CL.DelimiterLen) = @Delimiter 

) 
関連する問題