gpt4 book ai didi

postgresql - 计算与重叠日期范围关联的值的总和

转载 作者:行者123 更新时间:2023-11-29 12:45:59 24 4
gpt4 key购买 nike

我有一个简单的日期范围表,每个日期范围都有一个相关的每周小时数:

CREATE TABLE tmp_ranges (
id SERIAL PRIMARY KEY,
rng daterange,
hrs_per_week INT
);

还有一些值,我想根据这些值计算(即汇总)重叠/交叉日期范围内的每周总小时数:

INSERT INTO tmp_ranges (rng, hrs_per_week) VALUES
('[2014-03-15, 2014-06-28]', 9),
('[2014-04-18, 2014-07-15]', 2),
('[2014-06-03, 2014-09-12]', 9),
('[2014-10-03, 2014-11-14]', 6);

从图形上看(希望这能揭示更多而不是模糊),解决方案如下所示:

hrs/wk      T                                                 T`
9 | }-----|--------|--------> |
| |
2 | }--------|--------|-----> |
| |
9 | }--------|------|----> |
| |
6 | }---> |
| |
agg.hrs/wk --9-- ---11--- ---20--- --11-- --9-- -6-

最终日期范围故意与其他记录不连续,但仍会包含在最终记录集中...
显然,解决方案需要从原始 4 条记录生成 6 条记录,我很确定答案涉及使用窗口函数,但我完全不知所措......

有没有办法做到这一点?

非常感谢!

最佳答案

我尝试解决这个问题:

select y,
sum( hrs_per_week )
from tmp_ranges t
join(
select daterange( x,
lead(x) over (order by x) ) As y
from (
select lower( rng ) As x
from tmp_ranges
union
select upper( rng )
from tmp_ranges
order by x
) y
) y
on t.rng && y.y
group by y
order by y

演示:http://sqlfiddle.com/#!15/ef6cb/13

最里面的子查询使用 union 将所有边界日期收集到一个集合中,然后对它们进行排序。
然后外部子查询使用 lead 函数从相邻日期构建新范围。
最后,这些新范围在主查询中连接到源表,聚合,并计算sum


编辑
最内层查询中的 order by 子句是多余的,可以跳过,因为 lead(x) over caluse 按日期对记录进行排序,而最内层子查询的结果集不会不必排序。

关于postgresql - 计算与重叠日期范围关联的值的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22232796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com