创建" counter" psql中的数组

时间:2015-10-13 14:57:45

标签: sql postgresql psql postgresql-9.4

我在postgresql-9.4.2中有一个带有数组列的表。

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}      |

感谢您的帮助

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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)
;
相关问题