PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

postgres array_agg LỖI:không thể tích lũy các mảng có kích thước khác nhau

Dữ liệu mẫu:

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}'   );

Bạn nên tổng hợp các phần tử của mảng, không phải mảng. Sử dụng 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)    

Ngoài ra, bạn có thể tạo một tổng hợp tùy chỉnh. Bạn cần một hàm để hợp nhất các mảng (ghép nối với việc loại bỏ các bản sao):

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhập tệp từ PostgreSQL sang R

  2. Xác định bán kính hoặc đường kính của một vòng tròn giới hạn tối thiểu

  3. Kết xuất truy vấn PostgreSQL dưới dạng tệp excel

  4. Postgresql UUID được hỗ trợ bởi Hibernate?

  5. Làm cách nào để PostgreSQL chèn một hàng vào bảng khi bị xóa khỏi bảng khác?