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

配列上の集計関数

    次のようなものを試してください:

    SELECT id, unnest(array300) as val, ntile(100) OVER (PARTITION BY id) as bucket_num
    FROM your_table
    

    このSELECT array300ごとに300レコードが提供されます 同じidで そしてそれらにbucket_numを割り当てます (最初の3つの要素に1つ、次の3つの要素に2つ、というように続きます)。

    次に、この選択を使用してavgを取得します バケット内の要素の数:

    SELECT id, avg(val) as avg_val
    FROM (...previous select here...)
    GROUP BY id, bucket_num
    

    次へ-avg_valを集約するだけです 配列に:

    SELECT id, array_agg(avg_val) as array100
    FROM (...previous select here...)
    GROUP BY id
    

    詳細: unnest ntile array_agg OVER(PARTITION BY)

    UPD:この機能を試してください:

    CREATE OR REPLACE FUNCTION public.array300_to_100 (
      p_array300 numeric []
    )
    RETURNS numeric [] AS
    $body$
    DECLARE
      dim_start int = array_length(p_array300, 1); --size of input array
      dim_end int = 100; -- size of output array
      dim_step int = dim_start / dim_end; --avg batch size
      tmp_sum NUMERIC; --sum of the batch
      result_array NUMERIC[100]; -- resulting array
    BEGIN
    
      FOR i IN 1..dim_end LOOP --from 1 to 100.
        tmp_sum = 0;
    
        FOR j IN (1+(i-1)*dim_step)..i*dim_step LOOP --from 1 to 3, 4 to 6, ...
          tmp_sum = tmp_sum + p_array300[j];  
        END LOOP; 
    
        result_array[i] = tmp_sum / dim_step;
      END LOOP; 
    
      RETURN result_array;
    END;
    $body$
    LANGUAGE 'plpgsql'
    IMMUTABLE
    RETURNS NULL ON NULL INPUT;
    

    1つのarray300が必要です 1つのarray100を出力します 。使用するには:

    SELECT id, array300_to_100(array300)
    FROM table1;
    

    理解に問題がある場合は、私に聞いてください。



    1. Perl+PostgreSQL--選択的な列から行への転置

    2. MySQLの複数の結合を1つのクエリで実行しますか?

    3. MySQL-エンティティ:テーブル'TableDetails'の列'IsPrimaryKey'の値はDBNullです

    4. MySQLの配列値によるソート順