日期范围之间每个日期的汇总计数

时间:2018-04-09 07:48:51

标签: postgresql aggregate-functions

我想查找每个城市的每个日期的计数,其中我的日期范围由两列start_date和end_date指定。

假设我创建了一个包含这样值的表。

create table abc (city varchar(30),start_date date , end_date date);

insert into abc values('a','2018-01-01','2018-01-03');
insert into abc values('b','2018-01-02','2018-01-05');
insert into abc values('a','2018-01-03','2018-01-06');
insert into abc values('b','2018-01-03','2018-01-03');
insert into abc values('a','2018-01-02','2018-01-02');
insert into abc values('b','2018-01-02','2018-01-05');

我想知道每个日期城市a和b的数量是多少。这里应该告诉我这个。

a, 2018-01-01,1
a, 2018-01-02,2
a, 2018-01-03,2
a, 2018-01-04,1
a, 2018-01-05,1
a, 2018-01-06,1
b, 2018-01-02,2
b, 2018-01-03,3
b, 2018-01-04,2
b, 2018-01-05,2

如果它是一个单独的日期,那么一个小组就可以完成它。

感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

使用函数generate_series(start, stop, step interval)获取范围内的所有日期:

select city, date::date, count(*)
from abc
cross join generate_series(start_date, end_date, '1day'::interval) date
group by 1, 2
order by 1, 2

 city |    date    | count 
------+------------+-------
 a    | 2018-01-01 |     1
 a    | 2018-01-02 |     2
 a    | 2018-01-03 |     2
 a    | 2018-01-04 |     1
 a    | 2018-01-05 |     1
 a    | 2018-01-06 |     1
 b    | 2018-01-02 |     2
 b    | 2018-01-03 |     3
 b    | 2018-01-04 |     2
 b    | 2018-01-05 |     2
(10 rows)

上述查询中的交叉连接是横向连接,该函数对每一行执行一次。因为Postgres允许在选择列表中设置返回的函数,所以您也可以将其标记为:

select city, generate_series(start_date, end_date, '1day'::interval)::date date, count(*)
from abc
group by 1, 2
order by 1, 2