如何使用 sql 将同一范围内的多条记录的开始日期和结束日期分组
How to group start date and end date of multiple records within the same range with sql
我有一个查询 returns 我的一些记录如下:
ip; start_date; end_date
0.0.0.0; 09/10/2018 00: 00: 00; 10/10/2018 01:00:00
0.0.0.0; 10/10/2018 00: 00: 00; 11/10/2018 01:00:00
0.0.0.0; 10/10/2018 00: 00: 00; 11/10/2018 02:00:00
0.0.0.0; 10/10/2018 00: 00: 00; 11/10/2018 03:00:00
0.0.0.0; 10/10/2018 00: 00: 00; 11/10/2018 05:00:00
0.0.0.0; 10/12/2018 00: 00: 00; 10/10/2018 04:00:00
如您所见,我有一些记录,如果我们按开始和结束日期分组,它们将在同一时期内;
如何在查询中分组获取如下记录:
0.0.0.0; 09/10/2018 00: 00: 00; 11/10/2018 05:00:00
0.0.0.0; 10/12/2018 00: 00: 00; 10/10/2018 04:00:00
如您所见,前 5 行包含在同一范围内,而最后一行不包含。
您可以使用累积 max() 来查看哪里有重叠。在没有重叠的地方,一个小组开始。开始的一个累加和确定每个"island" 最后一步是聚合:
select ip, grp,
min(start_date), max(end_date)
from (select t.*,
sum(case when prev_max_end_date >= start_date
then 0 else 1
end) over (partition by ip order by start_date) as grp
from (select t.*,
max(end_date) over (partition by ip
order by start_date
rows between unbounded preceding and 1 preceding
) as prev_max_end_date
from t
) t
) t
group by ip, grp;
我有一个查询 returns 我的一些记录如下:
ip; start_date; end_date
0.0.0.0; 09/10/2018 00: 00: 00; 10/10/2018 01:00:00
0.0.0.0; 10/10/2018 00: 00: 00; 11/10/2018 01:00:00
0.0.0.0; 10/10/2018 00: 00: 00; 11/10/2018 02:00:00
0.0.0.0; 10/10/2018 00: 00: 00; 11/10/2018 03:00:00
0.0.0.0; 10/10/2018 00: 00: 00; 11/10/2018 05:00:00
0.0.0.0; 10/12/2018 00: 00: 00; 10/10/2018 04:00:00
如您所见,我有一些记录,如果我们按开始和结束日期分组,它们将在同一时期内;
如何在查询中分组获取如下记录:
0.0.0.0; 09/10/2018 00: 00: 00; 11/10/2018 05:00:00
0.0.0.0; 10/12/2018 00: 00: 00; 10/10/2018 04:00:00
如您所见,前 5 行包含在同一范围内,而最后一行不包含。
您可以使用累积 max() 来查看哪里有重叠。在没有重叠的地方,一个小组开始。开始的一个累加和确定每个"island" 最后一步是聚合:
select ip, grp,
min(start_date), max(end_date)
from (select t.*,
sum(case when prev_max_end_date >= start_date
then 0 else 1
end) over (partition by ip order by start_date) as grp
from (select t.*,
max(end_date) over (partition by ip
order by start_date
rows between unbounded preceding and 1 preceding
) as prev_max_end_date
from t
) t
) t
group by ip, grp;