按介于开始日期和结束日期之间的日期对实体进行计数(postgres)

时间:2018-08-15 16:03:45

标签: postgresql date time

使用Postgres,我正在尝试按过去一年中的每一天来获取活跃实体的数量。

对于每个实体,我都有一个名称,开始日期,结束日期。假设下面的模式-

表x

Entity|Start_date|End_date
x | 2018-01-07  |2018-01-23
y | 2018-01-08  |2018-04-01
z | 2018-01-22  |2018-01-24

我要输出的内容

Date|Count
2018-01-01|0
...
2018-01-07|1
...
2018-01-22|3
2018-01-23|3
2018-01-24|2
2018-01-25|1
...
2018-08-15|0

已经创建了一个日期表,但是不知道要加入什么。感觉像我必须创建另一个表,然后聚合它,但不确定它是什么。如果我不需要创建其他表,那就太好了。

任何帮助将不胜感激! T

编辑-我已经研究过FWIW,但是我不太确定我需要在这里研究什么-我缺少什么功能或联接

编辑2-包含示例

2 个答案:

答案 0 :(得分:0)

好吧,您需要为“ x”表中的每个Start_dateEnd_date计算天数。 (这发生在left join子查询中。)

然后,您只需要创建所有年份的天数列表,然后从“ x”表中“整天保留”到“计算天数”即可。

希望,这就是您想要的,如果希望的话,也希望您理解我试图解释的内容。

WITH year_days as (
    select * from generate_series('2018-01-01'::date, '2018-12-31'::date, '1 day'::interval) as d
),
x(Entity, Start_date, End_date) AS (
values 
('x','2018-01-07'::date, '2018-01-23'::date),
('y','2018-01-08'::date, '2018-04-01'::date),
('z','2018-01-22'::date, '2018-01-24'::date)
)

select year_days.d, coalesce(t.cnt, 0) from  year_days
left join (
    select generate_series(Start_date, End_date, '1 day'::interval) as d , count(*) as cnt  from x group by d
 ) t
on year_days.d = t.d

答案 1 :(得分:0)

您可以使用左加入年份的日期和诸如以下的实体来完成此操作:

select t.d, count(e.entity)  
from generate_series(
   make_date(date_part('year',current_date)::integer,1,1), 
   make_date(date_part('year',current_date)::integer,12,31), 
   '1 day'::interval) t(d)
left join entities e 
   on t.d between e.start_date and e.end_date
group by t.d
order by t.d;