2015-10-13 2 views
3

У меня есть таблица в postgresql-9.4.2 с столбцом массива.Создать массив «счетчик» в psql

create schema test_schema; 
create table test_schema.test_table; 
(
    array_column int[] 
); 
insert into test_schema.test_table values 
    (ARRAY[5,12,6,2]), 
    (ARRAY[51,4,2]), 
    (ARRAY[2]), 
    (ARRAY[3,16]); 

Какой будет выглядеть следующим образом

| array_column | 
    | integer[] | 
-------------------- 
    1 | {5,12,6,2} | 
    2 | {51,4,2}  | 
    3 | {2}   | 
    4 | {3,16}  | 

Я хочу, чтобы запросить эту таблицу и добавить столбец на мой запрос, который является массивом, считая от 1 до размера массива.

Я понял, как создать массив того же размера, как показано ниже

select 
    array_column, 
    array_fill(1,array[array_length(array_column,1)],array[1]) as counter 
from 
    test_schema.test_table; 

, который возвращает следующие результаты

| array_column | counter | 
    | integer[] | integer[] | 
--------------------------------- 
    1 | {5,12,6,2} | {1,1,1,1} | 
    2 | {51,4,2}  | {1,1,1} | 
    3 | {2}   | {1}  | 
    4 | {3,16}  | {1,1}  | 

Я собирался взять качению сумму счетчик, который дал бы мне желаемый результат, но я не могу понять, как это сделать.

Это желаемый результат:

| array_column | counter | 
    | integer[] | integer[] | 
--------------------------------- 
    1 | {5,12,6,2} | {1,2,3,4} | 
    2 | {51,4,2}  | {1,2,3} | 
    3 | {2}   | {1}  | 
    4 | {3,16}  | {1,2}  | 

Спасибо за вашу помощь

ответ

1

Используйте функцию generate_subscripts(array anyarray, dim int):

select 
    array_column, 
    array_agg(subscripts) subscripts 
from (
    select 
     array_column, 
     generate_subscripts(array_column, 1) subscripts 
    from 
     test_schema.test_table 
    ) sub 
group by 1; 

array_column | subscripts 
--------------+------------ 
{2}   | {1} 
{3,16}  | {1,2} 
{5,12,6,2} | {1,2,3,4} 
{51,4,2}  | {1,2,3} 
(4 rows) 
+0

'generate_scripts' является более простым, но обратите внимание, что ОП может не хочу удалять дубликаты в 'array_column' –

+0

@ClodoaldoNeto Я не хочу nk это фактически исключает дубликаты, я изменил мои значения для строки 1 на ARRAY [5,5,5,5], и ответ klin все еще работал – Dan

+0

@ Dan Я имею в виду дубликаты массивов между строками (2+ строки с тем же массивом) –

0
select array_column, a 
from 
    test_table 
    cross join lateral (
     select array_agg(a) 
     from generate_series(1, array_length(array_column, 1)) s(a) 
    ) s(a) 
; 
Смежные вопросы