PHP+SQLite:最大/最小値・平均値を求める

(1/1)
これまでに使ってきた年表データベースは、西暦何年から何年の間のデータが含まれているのであろうか。
そこで今回は、SQL に用意されている統計関数を利用し、カラム(生年、没年)の最大値や最小値、死亡時平均年齢をを求めるプログラムを作ってみることにする。

サンプル・プログラム

このプログラムは、生年・没年の各々の最小値・最大値を取り出し、最後に年号の範囲を求める。

解説:最大/最小値・平均値を求める

SQL の MIN 関数は指定したカラムの最小値を、MAX 関数は指定したカラムの最大値を求めるものである。
また、AVG 関数は平均値を求めるものである。

SELECT MIN(birth),MIN(death),MAX(birth),MAX(death),AVG(death - birth) FROM chronologic WHERE 1;


この SQL 文は、カラム birth の最小値/最大値、カラムdeath の最小値・最大値、および death と birth の差分、すなわち死亡時平均年齢の 5 つの値を取り出すものである。

0025: //実行するSQL
0026: define('PRE_MINMAX',  'SELECT MIN(birth),MIN(death),MAX(birth),MAX(death),AVG(death - birth) FROM chronologic WHERE 1;');

解説:年号の範囲を求める

年号の範囲は次のようにして求めている。
  • birth の最小値と death の最小値のうちの小さい方を開始年とする。
  • birth の最大値と death の最大値のうちの大きい方を終了年とする。
実際には、birth の最小値と death の最大値が年号の始点・終点になるはずだが、念のため、PHP の関数  min ,  max  を使って求めている。

0141:         //結果の取り出し+表示コンテンツ作成
0142:         $y_min = min($row[0]$row[1]);
0143:         $y_max = max($row[2]$row[3]);
0144: $res =<<< EOT
0145: <p>
0146: 生年(最小):{$row[0]}<br />
0147: 生年(最大):{$row[1]}<br />
0148: 没年(最小):{$row[2]}<br />
0149: 没年(最大):{$row[3]}
0150: </p>
0151: <p>死亡時平均年齢:{$row[4]}</p>
0152: <p>年号の範囲:{$y_min} - {$y_max}</p>
0153: 
0154: EOT;

SQL の実行にあたっては、「PHP+SQLite:条件に一致するレコードの数を数える」の時と同様、PDO の プリペアドステートメントを用いている。MIN関数、MAX関数で返されるカラムは、配列 $res の要素 0 から順に代入される。
(この項おわり)
header