2015-09-28 4 views
2

у меня есть таблица с 2 записей (с иллюстративной целью)PostgreSQL: Join 2 массивы с максимальными значениями

| id  | access (int array) | 
| ---------------------------- | 
| 1  | {0,1,0}   | 
| 2  | {1,0,0}   | 

я хотел бы, чтобы выбрать оба значения и объединить их вместе
, чтобы получить самое высокое значение делает результат в этом случае:

{1,1,0} 

массив доступа может вырасти до более чем 200 значений, и для этого я хотел бы избежать, чтобы сделать это в коде программирования (golang).

В основном это то же самое, что и этот вопрос: Merge two (or more) arrays and keep values that are highest?, но в моем случае разделенные столбцы объединены в одно поле с массивом.

ОБНОВЛЕНИЕ

  1. row(access) массив всегда имеют одинаковое количество значений
+1

Да, 'каждый строк (доступа)' имеют одинаковое количество значений – DonSeba

ответ

1

Попробуйте этот запрос (SqlFiddle):

select array_agg(elem) 
from (
    select distinct on (row_number) row_number, elem 
    from (
     select id, elem, row_number() over (partition by id) 
     from (
      select id, unnest(access) elem 
      from merge_test 
      where id in (1,2) 
      ) sub 
     ) sub 
    order by 1, 2 desc 
    ) sub; 

Бинарные массивы

Если массивы содержат только '0' и '1' и имеют одинаковое число значений:

create table merge_binary_test (id int, access int[]); 
insert into merge_binary_test values 
(1, '{0,1,0,1}'), 
(2, '{1,0,0,1}'); 

select string_to_array(bit_or(elem)::text, null)::int[] 
from (
    select id, array_to_string(access, '')::varbit elem 
    from merge_binary_test 
    where id in (1,2) 
    ) sub 

string_to_array 
----------------- 
{1,1,0,1} 
(1 row) 
1

Рассмотрим следующий пример:

create table arr(id int,access int[]); 
insert into arr values (1,'{0,1,0}'),(2,'{0,1,0}'),(3,'{0,0,9}'); 

так что строки будут:

id access 
-- ------- 
1 {0,1,0} 
2 {0,1,0} 
3 {0,0,9} 

Теперь функция может создан, чтобы объединить строки массива, как показано ниже:

CREATE 
    OR replace FUNCTION merge_array (
    arrval INT -- the total number of values in an array in my example its 3, but 200 is for yours 
    ,tbl TEXT --name of the table in which you want perform this function, 
    ,col TEXT -- name of the array col 
    ) 
RETURNS setof INTEGER [] AS $$ 

DECLARE qry TEXT; 

BEGIN 
    SELECT format('select translate(string_to_array(x.*::text,'','')::text,''()'','''')::int[] from (select %s from (select ' || col || ' ar from ' || tbl || ') as sq) as x ', egn) 
    INTO qry 
    FROM (
     SELECT string_agg('max(ar[' || val || '])', ',') egn 
     FROM (
      SELECT generate_series(1, arrval) val 
      ) t 
     ) tt; 

    RETURN QUERY 

    EXECUTE (qry); 
END;$$ 

LANGUAGE plpgsql 

Использование: select merge_array(3,'arr','access') Результат:

merge_array 
----------- 
{0,1,9}  
Смежные вопросы