2015-10-13 50 views
3

我在postgresql-9.4.2中有一個包含數組列的表。在psql中創建「counter」數組

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'是簡單,但請注意,OP可以不想消除'array_column'中的重複內容 –

+0

@ClodoaldoNeto我不知道這實際上消除了重複項,我修改了第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) 
;