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