如何使用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)