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

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

(2022年11月26日)PHP8対応,他.

目次

サンプル・プログラムの実行例

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

サンプル・プログラム

圧縮ファイルの内容
minmax.phpサンプル・プログラム
このプログラムは、生年・没年の各々の最小値・最大値を取り出し、最後に年号の範囲を求める。

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

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

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つの値を取り出すものである。

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

 198:         //結果の取り出し+表示コンテンツ作成
 199:         $y_min = min($row[0], $row[1]);
 200:         $y_max = max($row[2], $row[3]);
 201:         $res =<<< EOT
 202: <p>
 203: 生年(最小):{$row[0]}<br />
 204: 生年(最大):{$row[1]}<br />
 205: 没年(最小):{$row[2]}<br />
 206: 没年(最大):{$row[3]}
 207: </p>
 208: <p>死亡時平均年齢:{$row[4]}</p>
 209: <p>年号の範囲:{$y_min} - {$y_max}</p>
 210: 
 211: EOT;
 212:     }

年号の範囲は次のようにして求めている。
  • birthの最小値とdeathの最小値のうちの小さい方を開始年とする。
  • birthの最大値とdeathの最大値のうちの大きい方を終了年とする。
実際には、birthの最小値とdeathの最大値が年号の始点・終点になるはずだが、念のため、PHPの関数  min ,  max  を使って求めている。
SQLの実行にあたっては、「PHP+SQLite:条件に一致するレコードの数を数える」の時と同様、PDOの プリペアドステートメントを用いている。MIN関数、MAX関数で返されるカラムは、配列 $res の要素 0 から順に代入される。
(この項おわり)
header