假设我有桌子
CREATE TABLE branch
(
active_from timestamp without time zone,
active_until timestamp without time zone,
active_years integer[]
)
然后我想通过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来轻松解决问题.--
答案 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;