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

配列タイプのarray_agg

    配列の特定の配列を処理するカスタム集計を作成できます。例:

    DROP TABLE IF EXISTS e;
    CREATE TABLE e
    (
        id serial PRIMARY KEY,
        alert_type text,
        date_happened timestamp with time zone
    );
    
    INSERT INTO e(alert_type, date_happened) VALUES
        ('red', '2011-05-10 10:15:06'),
        ('yellow', '2011-06-22 20:01:19');
    
    CREATE OR REPLACE FUNCTION array_agg_custom_cut(anyarray)
    RETURNS anyarray
        AS 'SELECT $1[2:array_length($1, 1)]'
    LANGUAGE SQL IMMUTABLE;
    
    DROP AGGREGATE IF EXISTS array_agg_custom(anyarray);
    CREATE AGGREGATE array_agg_custom(anyarray)
    (
        SFUNC = array_cat,
        STYPE = anyarray,
        FINALFUNC = array_agg_custom_cut,
        INITCOND = $${{'', '', ''}}$$
    );
    

    クエリ:

    SELECT
        array_agg_custom(
            ARRAY[
                alert_type::text,
                id::text,
                CAST(extract(epoch FROM date_happened) AS text)
            ])
    FROM e;
    

    結果:

                  array_agg_custom              
    --------------------------------------------
     {{red,1,1305036906},{yellow,2,1308787279}}
    (1 row)
    

    編集:

    これが2番目の短い方法です(つまり、array_agg_custom_cutは必要ありません 機能しますが、追加のARRAYが表示されます クエリにはレベルが必要です):

    CREATE AGGREGATE array_agg_custom(anyarray)
    (
        SFUNC = array_cat,
        STYPE = anyarray
    );
    
    SELECT
        array_agg_custom(
            ARRAY[
                ARRAY[
                    alert_type::text,
                    id::text,
                    CAST(extract(epoch FROM date_happened) AS text)
                ]
            ])
    FROM e;
    

    結果:

                  array_agg_custom              
    --------------------------------------------
     {{red,1,1305036906},{yellow,2,1308787279}}
    (1 row)
    


    1. Max()関数を使用してグループ値を選択する

    2. RECORDの列をループします

    3. カスタムOracleタイプのオブジェクトマッピングを渡そうとしたときに無効な名前パターン

    4. 本当にSETXACT_ABORTONを使用する必要がありますか?