Eventid start_date end_date City
1 2015-02-01 2015-02-04 Chennai
2 2015-02-02 2015-02-05 Chennai
4 2015-02-04 2015-02-06 Mumbai
3 2015-02-03 2015-02-07 Chennai
6 2015-02-08 2015-02-10 Kolkata
5 2015-02-06 2015-02-09 Mumbai
7 2015-02-10 2015-02-11 Kolkata
使用Postgres,将date range和intersection operator *
与window function一起使用非常容易:
with diffs as (
select eventid, start_date, end_date, city,
daterange(start_date, end_date, '[]') * lead(daterange(start_date, end_date, '[]')) over (partition by city order by start_date) as overlap
from events
)
select eventid, start_date, end_date, city,
upper(overlap) - lower(overlap) as num_days
from diffs
order by city, start_date;
给出您的样本数据,将返回:
eventid | start_date | end_date | city | num_days
--------+------------+------------+---------+---------
1 | 2015-02-01 | 2015-02-04 | Chennai | 3
2 | 2015-02-02 | 2015-02-05 | Chennai | 3
3 | 2015-02-03 | 2015-02-07 | Chennai |
6 | 2015-02-08 | 2015-02-10 | Kolkata | 1
7 | 2015-02-10 | 2015-02-11 | Kolkata |
4 | 2015-02-04 | 2015-02-06 | Mumbai | 1
5 | 2015-02-06 | 2015-02-09 | Mumbai |