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

N個の値ごとにグループ化

    頭に浮かぶ最初のアプローチは、row_number()を使用することです。 テーブルに注釈を付けてから、16行のブロックでグループ化します。

    SELECT min(id) as first_id, max(id) AS last_id, avg(rainfall) AS avg_this_16
    FROM (
      SELECT id, rainfall, row_number() OVER (order by id) AS n
      FROM the_table
    ) x(id,rainfall,n)
    GROUP BY n/16
    ORDER BY n/16;
    

    これには、最後のグループの16個のサンプルが含まれるとは限らないことに注意してください。

    または、移動平均を計算することもできます。 avg()を使用する ウィンドウ関数として:

    SELECT id, avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING)
    FROM the_table;
    

    ...行番号で注釈を付け、必要なものを選択する可能性があります:

    SELECT id AS greatest_id_in_group, avg_last_16_inclusive FROM (
      SELECT
        id, 
        avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING) AS avg_last_16_inclusive,
        row_number() OVER (ORDER BY id) AS n
      FROM the_table
    ) x WHERE n % 16 = 0;
    

    これにより、最後のn <16サンプルは無視され、行は返されません。

    IDが連続していることが保証されていないことを前提としていることに注意してください。ギャップがない場合は、group by id/16するだけです。 窓関数は避けてください。



    1. PostgreSQLトリガーからメールを送信するにはどうすればよいですか?

    2. MySQLでUNIONを使用する場合の「エラー1250(42000):SELECTの1つからのテーブル「…」をグローバルORDER句で使用できない」を修正

    3. フルAzureポータルのClearDBMySQLデータベースはどこにありますか?

    4. @BatchSizeは賢い使用ですか、それとも愚かな使用ですか?