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

postgres array_aggエラー:異なる次元の配列を蓄積できません

    データ例:

    create table my_table(name text, numbers text[], letters text[]);
    insert into my_table values
        ('first',  '{1, 2}', '{a}'   ),
        ('first',  '{2, 3}', '{a, b}'),
        ('second', '{4}',    '{c, d}'),
        ('second', '{5, 6}', '{c}'   );
    

    配列ではなく、配列要素を集約する必要があります。 unnest()を使用する :

    select 
        name, 
        array_agg(distinct number) as numbers, 
        array_agg(distinct letter) as letters
    from 
        my_table, 
        unnest(numbers) as number, 
        unnest(letters) as letter
    group by name;
    
      name  | numbers | letters 
    --------+---------+---------
     first  | {1,2,3} | {a,b}
     second | {4,5,6} | {c,d}
    (2 rows)    
    

    または、カスタム集計を作成することもできます。配列をマージする関数が必要です(重複を削除する連結):

    create or replace function public.array_merge(arr1 anyarray, arr2 anyarray)
        returns anyarray language sql immutable
    as $$
        select array_agg(distinct elem order by elem)
        from (
            select unnest(arr1) elem 
            union
            select unnest(arr2)
        ) s
    $$;
    
    create aggregate array_merge_agg(anyarray) (
        sfunc = array_merge,
        stype = anyarray
    );
    
    select 
        name, 
        array_merge_agg(numbers) as numbers, 
        array_merge_agg(letters) as letters
    from my_table
    group by name;
    


    1. 列の違いを取得するには、ユーザーごとに最新の2つの行を選択します(MySQL)

    2. スタートアップスクリプトをmysqldockerコンテナに追加するにはどうすればよいですか?

    3. SQLクエリ実行時のMySQL構文エラー

    4. SQLデータベースの次元および単位分析