集約関数を使いこなす
SUM関数のやり方で、ほかの集約関数を実現する
SUM関数では、2段階に分けて集計を行いました。同じように、多くのGROUP BY 句の集約関数は、2段階で実現されます。
SUM関数では、第1段階、第2段階ともにSUM関数でしたが、ほかの集約関数では、それが変わります。集約関数の実施方法を図2上にまとめました。それぞれの集約関数を用いた値の求め方についてみていきましょう。
COUNT関数は、該当する行数を数える関数です。
第1段階はCOUNT関数を、第2段階では、第1段階の結果を合計するSUM関数を用いることにより実現できます。
なお、DISTINCT句を用いる場合には、次の例のように第1段階で指定します。
第1段階 : SELECT COUNT(DISTINCT [値]) AS [暫定行数] ...
第2段階 : SELECT SUM([暫定行数]) AS [行数] ...
AVG関数は、平均値を求める関数です。SUM関数とCOUNT関数を組み合わせることにより実現できます。
第1段階はSUM関数およびCOUNT関数による値の両方を求めます。それらを、第2段階で分母分子に用いてAVG関数の結果を得ます。
なお、第2段階において、該当するレコード数が無い場合にエラーが出ないよう、IF文まどで分岐させてください。次のようなクエリになるでしょう。
第2段階 : SELECT IF(SUM([暫定行数]>0, SUM([暫定合計])÷SUM([暫定行数]), NULL)...
MIN関数およびMAX関数はSUM関数同様にシンプルです。
第1段階、第2段階ともに、MIN関数またはMAX関数を適用します。
STD, STDDEV関数を実現する
これまでの集約関数は、2段階で実現できましたが、標準偏差を求めるSTD, STDDEV関数は、上記の集約関数を2サイクルまわす必要があるので、結果、4段階のクエリになります。
最初に、平均値(AVG)、およびデータの個数(COUNT)を計算します(最初のサイクル)。求めた平均値とデータの個数を用いて2サイクル目で標準偏差を求めます。
この流れを図2の下に示します。具体的には一度、親サーバーで集計した後、再び並列にクエリを行い、再度親サーバーで集計するという流れになります。
なお、標準偏差を算出した後に、各要素の偏差値を求める場合には、2サイクル目の第1段階を集計クエリとするのではなく、平均との差分をダンプし、2段階目で標準偏差を出した後、偏差値を計算するといった流れにすることも考慮すべきでしょう。こうすることで、全体の計算コストを低くすることができます。
2サイクル目は以下のようになります。
第1段階 : SELECT ([値]-[平均値]) AS [差分] ...
第2段階の1 : SELECT SQRT(SUM([差分]×[差分])÷[個数]) AS [標準偏差] ...
第2段階の2 : SELECT (50.0 + [差分] ÷ [標準偏差]) AS [偏差値] ...
次に集約関数を利用する場合の注意点を紹介します。