PostgreSQL: 集合を返すGENERATE_SERIES関数で大量データを生成して集計する


こんにちは、鈴木です。

PostgreSQL ユーザの方!

GENERATE_SERIES という関数をご存知でしょうか。

 

集合を返す GENERATE_SERIES 関数

GENERATE_SERIES 関数は少し変わっていて、集合を返す関数です。

動作を見ていただいた方が分かりやすいかもしれません。

このように GENERATE_SERIES 関数は連続値を生成します。

第三引数を指定することで、刻み幅を指定することもできます。

適当な演算を行うことで、連続する日付を生成することもできます。

乱数を 1000 個! という場合はこうします。

 

テスト用の大量データを生成する

GENERATE_SERIES 関数を使うと、テストに使用する大量データを手軽に生成することができます。

例として、売上情報を保持する sales テーブルがあるとします。

この sales テーブルに大量データを登録したいのですが、どのような SQL を書けば良いでしょうか。

段階的に考えていきましょう。

まず、売上日と売上金額は固定のデータを生成する SQL を考えると、以下のようになりますね。

実行すると、以下の出力が得られます。

それでは、売上日と売上金額を乱数で決めることにしましょう。

以下のような SQL になるでしょうか。

実行してみます。

良さそうな値が生成出来ましたので、それを sales テーブルに INSERT します。

実行すると、sales テーブルに 100 件のレコードが登録されます。

sales テーブルを SELECT すると、確かに 100 件のレコードが登録されていることが確認できます。

良さそうな感じです。

 

日別の売上金額を求める

せっかく sales テーブルに大量データを登録したので、日別の売上金額を求めてみましょう。

日別の売上金額を求める SQL はこんな感じになるでしょうか。。

実行してみましょう。

日付に抜けが出てしまいました・・。

売上が無い日がある場合も考慮しておかなければなりませんでした。

GENERATE_SERIES 関数を用いて、期待する結果が得られるような SQL に書き直すと次のようになります。

実行します。

期待する結果が得られました!

 

まとめ

今回は PostgreSQL の GENERATE_SERIES 関数をピックアップしてご紹介しましたが、あることを達成する SQL の書き方はひと通りとは限りません。こんなやり方もあるんだ、と思っていただければ幸いです。

 


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です