2017-02-19 26 views
0

У меня есть рекурсивный запрос, в котором я получаю строки массивов, как показано ниже. Как можно объединить все строки в один массив в одну строку и удалить дубликаты? Заказ не важен.Postgres Arrays Rows aggregation

--my_column-- 
"{431}" 
"{431,33}" 
"{431,60}" 
"{431,28}" 
"{431,1}" 
"{431,226}" 
"{431,38}" 
"{431,226,229}" 
"{431,226,227}" 
"{431,226,235}" 
"{431,226,239}" 
"{431,226,241}" 

Я попробовал запрос ниже, но я получаю один пустой целое [] колонка

select array(select unnest(my_column) from my_table 

благодаря

+0

В вашем списке нет дубликатов. Какие результаты вы хотите? –

ответ

2

Использование array_agg() с distinct и (не обязательно) order by от unnest():

with my_table(my_column) as (
values 
    ('{431}'::int[]), 
    ('{431,33}'), 
    ('{431,60}'), 
    ('{431,28}'), 
    ('{431,1}'), 
    ('{431,226}'), 
    ('{431,38}'), 
    ('{431,226,229}'), 
    ('{431,226,227}'), 
    ('{431,226,235}'), 
    ('{431,226,239}'), 
    ('{431,226,241}') 
) 

select array_agg(distinct elem order by elem) 
from my_table, 
lateral unnest(my_column) elem; 

        array_agg     
--------------------------------------------- 
{1,28,33,38,60,226,227,229,235,239,241,431} 
(1 row) 
+0

Спасибо, что сработало! – jimny

2

A раствор номера без lateral subquery:

select array_agg(distinct val) from 
    (select unnest(my_column) as val from my_table) x; 
+0

Это прекрасно работало – jimny