sql >> データベース >  >> RDS >> PostgreSQL

5分間でグループ化されたレコードの平均を選択する

    SELECT grid.t5
          ,min(t."time") AS min_time
    --    ,array_agg(extract(min FROM t."time")) AS 'players_on' -- optional
          ,avg(t.players) AS avg_players
          ,avg(t.servers) AS avg_servers
    FROM (
       SELECT generate_series(min("time")
                             ,max("time"), interval '5 min') AS t5
       FROM tbl
       ) grid
    LEFT JOIN tbl t ON t."time" >= grid.t5
                   AND t."time" <  grid.t5 +  interval '5 min'
    GROUP  BY grid.t5
    ORDER  BY grid.t5;
    

    説明

    • サブクエリgridtime"の最小値から最大値まで、5分ごとに1行を生成します あなたのテーブルに。

    • 5分間隔でデータをスライスするテーブルに左に参加します。慎重に含める 下の境界線と除外 上部の境界線。

    • 何も起こらなかった場所に5分のスロットをドロップするには、JOINを使用します LEFT JOINの代わりに 。

    • グリッド時間を0:00、5:00などに開始するには、min("time")を切り捨てます。 generate_series()内 。

    これらの関連する回答の詳細な説明:
    グループ化データ間隔
    PostgreSQL:クエリの実行行数'分単位'

    余談ですが、timeは使いません 識別子として。これは、標準SQLで予約されている単語 です。 とPostgresの関数/型名。



    1. justify_interval()がPostgreSQLでどのように機能するか

    2. PostgreSQLデータソースをWildFly9.0に追加するにはどうすればよいですか?

    3. PostgreSQL 9.3:2つの列を1つに統合

    4. Railsには、左側のテーブルからすべての結果を返さない条件のクエリが含まれています