英文:
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)}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论