PR

PostgreSQLで時系列データを任意の時間間隔でグルーピングするSQL実装例

PostgreSQLのアイキャッチ PostgreSQL
PostgreSQL

やり方

概要

例えば30分毎にまとめたい場合は次のようにします。
00:00~00:29間の件数、00:30~00:59間の件数、01:00~01:29間の件数のような形です。

SQL

仕組み

generate_series関数で下記のように30分毎のタイムスタンプを作成します。
上記ではhh24:miでフォーマットしています。

これに集計したいテーブルのデータをLEFT JOINします。

generate_series関数で作成した項目でグルーピングしてカウントすると出来上がりです。

generate_series関数について

startからstopまでstep intervalの間隔で連続したデータを作成します。fromで指定することによって1カラムのテーブルのような形で利用できます。

9.24. Set Returning Functions

  • Function
    generate_series(start, stop, step interval)
  • Argument Type
    timestamp or timestamp with time zone
  • Return Type
    setof timestamp or setof timestamp with time zone (same as argument type)
  • Description
    Generate a series of values, from start to stop with a step size of step
PostgreSQL: Documentation: 9.6: Set Returning Functions
https://www.postgresql.org/docs/9.6/functions-srf.html

実際にやってみる

テーブル作成

1日分のアクセス数を30分毎に集計してみるパターンでやってみます。
別にタイムスタンプだけで良いと思いますがとりあえずアクセスログっぽい感じでユーザー名とかも入れておきます

psql

テストデータを作成

1分単位のランダムなタイムスタンプを1万件ほど作成します。ユーザー名は、どうしましょう・・・とりあえずテキトーな文字をいれます。余計なものいれるからこうなる・・・

psql

10件ほど出来上がったデータを確認してみるといい感じに分単位のランダムなタイムスタンプとなっていることが確認できます。

psql

集約したカウントを取得する

今日という1日間の30分ごとの件数を取得します。

psql

これをそのままエクセルに持っていけばワンクリックでグラフにできますね!

Excelに結果を張り付ければワンクリックでgraphにできる!

当ブログの内容はできる限り正確な情報を提供するよう努めていますが、利用にあたっては自己責任でお願いいたします。
掲載内容に基づく操作・設定などによって生じたトラブルや損害について、当サイトは一切の責任を負いません。
ちゅんろぐをフォローする

コメント

タイトルとURLをコピーしました