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

SQLクエリの結果行を全範囲で均等に減らす方法は?

    Postgres width_bucket() 探しているのは、任意の数の行を細分化することです(N )基になるテーブル内の特定の(できれば小さい )データポイントの数(n )。重みを示すために、各データポイントに寄与する行数を追加できます。

    1つの小さな障害:width_bucket()のバリアント double precisionで動作する必要があります またはnumeric timestampではなく数字 etal。 エポックを抽出するだけです 一緒に作業します。

    このテーブル定義と現在のPostgresバージョンを想定:

    CREATE TABLE tbl (
      tbl_id serial PRIMARY KEY
    , value  numeric NOT NULL
    , created_at timestamptz NOT NULL
    );
    

    クエリ:

    SELECT width_bucket(extract(epoch FROM t.created_at), x.min_epoch, x.max_epoch, 400) AS pix
         , round(avg(t.value), 2) AS avg  -- round is optional
         , count(*) AS weight
    FROM   big t
    CROSS  JOIN (SELECT extract(epoch FROM min(created_at)) AS min_epoch
                      , extract(epoch FROM max(created_at)) AS max_epoch FROM big) x
    GROUP  BY 1
    ORDER  BY 1;
    

    結果:

    pix | avg    | weight
    ----+--------+------
    1   | 152.58 | 7
    2   | 155.16 | 8
    3   | 148.89 | 7
    ...
    

    Nでない限り、400行を返します <n 、この場合、Nを取得します 行。

    関連:




    1. javaを使用して長いblob(画像)をmysqlデータベースにアップロードし、phpで取得するにはどうすればよいですか?

    2. mysqlクエリで親ごとにすべての子を取得します

    3. 2つのクエリの結果を1つのデータセットに結合する方法

    4. 今週の注文テーブルからレコードをプルします