Union aggregate datemultiranges in Postgres

huangapple go评论101阅读模式
英文:

Union aggregate datemultiranges in Postgres

问题

我有一个包含datemultirange类型的表。
我想要合并(计算多行的并集)。

SELECT
  type_id,
  range_agg(some_date_ranges)
FROM foo
GROUP BY type_id

我的表foo大致如下:

id (int) some_date_ranges(datemultirange) type_id (int)
1 {[2016-07-02,2016-07-24),[2017-10-05,2017-10-12),[2018-05-23,2021-03-08)} 4
2 {[2016-07-03,2016-07-24),[2017-10-03,2017-10-13),[2018-05-23,2021-04-08)} 4
2 {[2016-07-27,2016-07-28),[2017-10-02,2017-10-14),[2018-05-23,2021-05-08)} 5

如果我尝试运行上面的函数,会出现错误function range_agg(datemultirange) does not exist。与函数aggregate_union类似。

到目前为止,我找到的唯一解决方案是使用一个使用unnest的公共表达式(CTE),然后在此之后使用range_agg。但这不够优雅。有更好的方法吗?

详细信息

  • Postgres 14
英文:

I have a table with a datemultirange type.
I want to combine (compute the union) of multiple rows.

SELECT
  type_id,
  range_agg(some_date_ranges)
FROM foo
GROUP BY type_id

My table foo looks something like this:

id (int) some_date_ranges(datemultirange) type_id (int)
1 {[2016-07-02,2016-07-24),[2017-10-05,2017-10-12),[2018-05-23,2021-03-08)} 4
2 {[2016-07-03,2016-07-24),[2017-10-03,2017-10-13),[2018-05-23,2021-04-08)} 4
2 {[2016-07-27,2016-07-28),[2017-10-02,2017-10-14),[2018-05-23,2021-05-08)} 5

If I try to run the function above, I get the error function range_agg(datemultirange) does not exist. Similar with the function aggregate_union.

The only solution I've found so far is with a CTE that uses unnest and then using range_agg after that. But it's inelegant. Is there a better way?

Details

  • Postgres 14

答案1

得分: 1

在Postgres 14中,可以像这样创建一个简单的多范围表:

create table multi_range_test(date_mr datemultirange);
insert into 
    multi_range_test 
values 
    ('{[2016-07-02,2016-07-24),[2017-10-05,2017-10-12), [2018-05-23,2021-03-08)}'::datemultirange), 
    ('{[2016-07-03,2016-07-24),[2017-10-03,2017-10-13),[2018-05-23,2021-04-08)}'::datemultirange) ,
    ('{[2016-07-27,2016-07-28),[2017-10-02,2017-10-14),[2018-05-23,2021-05-08)}'::datemultirange);

select range_agg(mr) from (select unnest(date_mr) from multi_range_test) as t(mr) ;
                                             range_agg                                             
---------------------------------------------------------------------------------------------------
 {[07/02/2016,07/24/2016),[07/27/2016,07/28/2016),[10/02/2017,10/14/2017),[05/23/2018,05/08/2021)}

与Postgres 15中的 range_agg(date_mr) 相比:

select range_agg(date_mr) from multi_range_test ;
                                             range_agg                                             
---------------------------------------------------------------------------------------------------
 {[07/02/2016,07/24/2016),[07/27/2016,07/28/2016),[10/02/2017,10/14/2017),[05/23/2018,05/08/2021)}
英文:

In Postgres 14 as simple as I could get it is something like:

create table multi_range_test(date_mr datemultirange);
insert into 
    multi_range_test 
values 
    ('{[2016-07-02,2016-07-24),[2017-10-05,2017-10-12), [2018-05-23,2021-03-08)}'::datemultirange), 
    ('{[2016-07-03,2016-07-24),[2017-10-03,2017-10-13),[2018-05-23,2021-04-08)}'::datemultirange) ,
    ('{[2016-07-27,2016-07-28),[2017-10-02,2017-10-14),[2018-05-23,2021-05-08)}'::datemultirange);

select range_agg(mr) from (select unnest(date_mr) from multi_range_test) as t(mr) ;
                                             range_agg                                             
---------------------------------------------------------------------------------------------------
 {[07/02/2016,07/24/2016),[07/27/2016,07/28/2016),[10/02/2017,10/14/2017),[05/23/2018,05/08/2021)}

Compared to range_agg(anymultirange) in Postgres 15:

select range_agg(date_mr) from multi_range_test ;
                                             range_agg                                             
---------------------------------------------------------------------------------------------------
 {[07/02/2016,07/24/2016),[07/27/2016,07/28/2016),[10/02/2017,10/14/2017),[05/23/2018,05/08/2021)}

huangapple
  • 本文由 发表于 2023年2月19日 06:24:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/75496759.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定