0

クエリを正しく調整できないようです。任意の助けをいただければ幸いです。

これが私のクエリです:

SELECT 
  wordlist.Word,
  SUM( worddocfreq.Freq ) AS wordFreq
FROM sourceparsed
  LEFT JOIN worddocfreq ON sourceparsed.ParsedID = worddocfreq.ParsedID
  LEFT JOIN wordlist ON worddocfreq.WordID = wordlist.WordID
WHERE
  sourceparsed.SrcID = 30032
GROUP BY
  wordlist.Word

これは期待どおりに機能し、結果セットの例として 2 つの列を取得します。最初の列は個別の単語のリストで、2 番目の列は各単語の頻度です。

ただし、2 番目の列が割合 (つまり、各単語の出現回数の合計を単語の総数で割ったもの) になるように、クエリを調整したいと思います。単語の総数は、上記のようにクエリから出力されるため、2 番目の列の合計によって得られます。

したがって、私の問題は、単語の総数の合計を計算する方法がわからないことです。これは、クエリの最後の「グループ化」により、単語ごとに合計が計算されることが遡及的に課されるためです。したがって、「グループ化」の用語に関係なく、計算された合計で 2 番目の列を分割する方法がわかりません。

ネストされた選択が必要だと感じていますが、これを最適に統合する方法がわかりません。

アドバイスをよろしくお願いします。

乾杯、

ブライアン

4

3 に答える 3

1

これが最も効率的な方法かどうかはわかりませんが、これを試してみてください。

SELECT 
  wordlist.Word,
  SUM( worddocfreq.Freq ) / ( SELECT SUM( Freq ) 
                              FROM worddocfreq 
                                JOIN sourceparsed ON 
                                      sourceparsed.SrcID = sp1.SrcID
                                  AND sourceparsed.ParsedID = worddocfreq.ParsedID
                            ) AS proportion
FROM sourceparsed sp1
  LEFT JOIN worddocfreq ON sourceparsed.ParsedID = worddocfreq.ParsedID
  LEFT JOIN wordlist ON worddocfreq.WordID = wordlist.WordID
WHERE
  sourceparsed.SrcID = 30032
GROUP BY
  wordlist.Word
于 2012-07-19T21:01:38.030 に答える
0

サブクエリへのACROSS JOINは、SetFreeByTruth のアプローチよりも効率的である場合もあれば、そうでない場合もあります。

SELECT 
  wordlist.Word,
  SUM( worddocfreq.Freq ) / TotalFreq.TotalFreq AS wordFreq
FROM sourceparsed
  LEFT JOIN worddocfreq ON sourceparsed.ParsedID = worddocfreq.ParsedID
  LEFT JOIN wordlist ON worddocfreq.WordID = wordlist.WordID
  CROSS JOIN ( SELECT SUM( Freq ) AS TotalFreq FROM worddocfreq ) AS TotalFreq
WHERE
  sourceparsed.SrcID = 30032
GROUP BY
  wordlist.Word
于 2012-07-19T21:03:06.857 に答える
0

ゼロ除算エラーに注意してください。より良いアプローチがあるかもしれませんが、次のことを試すことができます。

select c,wordFreq,sum_all, wordFreq/sum_all as proportion from 
(

    (

        select wordlist.Word,
        sum(worddocfreq.Freq) as wordFreq
        from sourceparsed
        left join worddocfreq on sourceparsed.ParsedID = worddocfreq.ParsedID
        left join wordlist on worddocfreq.WordID = wordlist.WordID
        where sourceparsed.SrcID = 30032
        group by wordlist.Word

    ) c
   LEFT OUTER JOIN
   (select SUM(worddocfreq.Freq) sum_all  
    from sourceparsed
    left join worddocfreq on sourceparsed.ParsedID = worddocfreq.ParsedID
    left join wordlist on worddocfreq.WordID = wordlist.WordID 
    where sourceparsed.SrcID = 30032
   ) t
   ON 1=1
) 
于 2012-07-19T21:03:26.940 に答える