集約関数を使いこなす

2008年7月23日(水)
田中 宏昌

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 [偏差値] ...

 次に集約関数を利用する場合の注意点を紹介します。

株式会社メディカルアーキテクツ
株式会社メディカルアーキテクツ、共同経営者。NTTデータ、NTTデータ経営研究所(出向)にてITプロジェクトの企画や企業の戦略系コンサルティングを数多く経験。その後、外資系医療コンサルティング企業のCIOとして伝説のシステムを数多く作り上げ、2年前に起業。東京大学工学部航空宇宙工学科卒。http://www.mediarc.jp/

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています