如何查询更新数组列与postgresql中生成的另一列?

时间:2015-10-30 04:43:50

标签: database postgresql rdbms

假设我有桌子

CREATE TABLE branch
( 
  active_from timestamp without time zone,
  active_until timestamp without time zone,
  active_years integer[]
)
  • active_from和active_until列都填充了timestamp值。
  • active_years仍为空。

然后我想通过active_from和active_until列生成active_years的值。

示例数据

|active_from          |active_until           |active_years
|'2013-01-22 00:00:00'|'2015-01-22 00:00:00'  |{2013,2014,2015}

知道怎么查询吗?感谢

- 我知道我们可以通过开发迷你app来轻松解决问题.--

2 个答案:

答案 0 :(得分:3)

您可以使用generate_series()函数生成已经过去的年数,然后汇总它们:

select active_from, active_until, array_agg(extract(year from active_year)) as active_years
from (
  select *
  from branch
    cross join lateral generate_series(active_from, active_until, interval '1' year) as x (active_year)
) t
group by active_from, active_until;

由于lateral查询,上述内容需要Postgres 9.3或更高版本。

对于早期版本,您可以使用:

select active_from, active_until, array_agg(yr) as active_years
from (
  select active_from, active_until, extract(year from generate_series(active_from, active_until, interval '1' year)) as yr
  from branch
) t
group by active_from, active_until;

但是这依赖于在选择列表中调用set-returns函数而不鼓励,所以如果你在9.4上,你应该更喜欢横向连接。

答案 1 :(得分:1)

我想有几种解决方案......

解决方案可以使用EXTRACT()generate_series()array_agg

功能
SELECT array_agg(years) from 
  (SELECT generate_series(_from::int,_until::int) as years FROM
     (SELECT extract(year from active_from) AS _from,
             extract(year from active_until) AS _until 
      FROM branch
  ) as foo
)foo;