如何使用PostgreSQL中表提供的可变日期范围计算行数
我想我需要某种窗口功能来完成这项工作。我以以下项目数据为例:如何使用PostgreSQL中表提供的可变日期范围计算行数,postgresql,aggregate-functions,Postgresql,Aggregate Functions,我想我需要某种窗口功能来完成这项工作。我以以下项目数据为例: count | date ------+----------- 3 | 2017-09-15 9 | 2017-09-18 2 | 2017-09-19 6 | 2017-09-20 3 | 2017-09-21 首先,我的数据中存在缺口,我在这里还有另一个问题: select until_date, until_date - (lag(until_date) over ()) as del
count | date
------+-----------
3 | 2017-09-15
9 | 2017-09-18
2 | 2017-09-19
6 | 2017-09-20
3 | 2017-09-21
首先,我的数据中存在缺口,我在这里还有另一个问题:
select until_date, until_date - (lag(until_date) over ()) as delta_days from ranges
我已经生成了以下数据:
until_date | delta_days
-----------+-----------
2017-09-08 |
2017-09-11 | 3
2017-09-13 | 2
2017-09-18 | 5
2017-09-21 | 3
2017-09-22 | 1
因此,我希望我的最终查询生成以下结果:
start_date | ending_date | total_items
-----------+-------------+--------------
2017-09-08 | 2017-09-10 | 0
2017-09-11 | 2017-09-12 | 0
2017-09-13 | 2017-09-17 | 3
2017-09-18 | 2017-09-20 | 15
2017-09-21 | 2017-09-22 | 3
它根据第二个表中的自定义范围,告诉我每天第一个表中的项目总数
在这个特定的例子中,我将对开始和结束之间的所有项目进行汇总,因为在日期上会有重叠,我将从结束日期中减去1以不计算重复项
有人知道怎么做吗
谢谢 使用该类型。请注意,您不必计算delta_天数,只需将范围转换为数据范围并使用运算符即可
请注意,在DateRange中,上面的下限是包含的,而上限是独占的
如果要计算日期范围内每天的项目数:
select
daterange, total_items,
round(total_items::dec/(upper(daterange)- lower(daterange)), 2) as items_per_day
from (
select daterange, coalesce(sum(count), 0) as total_items
from (
select daterange(lag(until_date) over (order by until_date), until_date)
from ranges
) s
left join counts on date <@ daterange
where not lower_inf(daterange)
group by 1
) s
order by 1
daterange | total_items | items_per_day
-------------------------+-------------+---------------
[2017-09-08,2017-09-11) | 0 | 0.00
[2017-09-11,2017-09-13) | 0 | 0.00
[2017-09-13,2017-09-18) | 3 | 0.60
[2017-09-18,2017-09-21) | 17 | 5.67
[2017-09-21,2017-09-22) | 3 | 3.00
(5 rows)
听起来不难,但缺乏预期结果使任务不明确谢谢你的建议,我用预期结果澄清了我的问题。
select
daterange, total_items,
round(total_items::dec/(upper(daterange)- lower(daterange)), 2) as items_per_day
from (
select daterange, coalesce(sum(count), 0) as total_items
from (
select daterange(lag(until_date) over (order by until_date), until_date)
from ranges
) s
left join counts on date <@ daterange
where not lower_inf(daterange)
group by 1
) s
order by 1
daterange | total_items | items_per_day
-------------------------+-------------+---------------
[2017-09-08,2017-09-11) | 0 | 0.00
[2017-09-11,2017-09-13) | 0 | 0.00
[2017-09-13,2017-09-18) | 3 | 0.60
[2017-09-18,2017-09-21) | 17 | 5.67
[2017-09-21,2017-09-22) | 3 | 3.00
(5 rows)