如何使用sql对同一范围内多条记录的开始日期和结束日期进行分组
我有一个查询,返回我一些记录,如下所示:如何使用sql对同一范围内多条记录的开始日期和结束日期进行分组,sql,group-by,rank,Sql,Group By,Rank,我有一个查询,返回我一些记录,如下所示: 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
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行包含在同一范围内,而最后一行不包含在同一范围内。您可以使用累积最大值()查看重叠的位置。如果没有重叠,那么就开始分组。开始的累积和决定每个“孤岛”,最后一步是聚合:
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;
可以使用累积最大值()查看重叠的位置。如果没有重叠,那么就开始分组。开始的累积和决定每个“孤岛”,最后一步是聚合:
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;
最后一个范围似乎在开始日期之前有结束日期您正在使用哪些RDBMS?除了Nicks观察。。。在哪种情况下,您希望两个间隔在同一组中?它们之间存在“重叠间隔路径”?嗯,这听起来像是一个递归with语句或类似的东西,我猜最后一个范围似乎在开始日期之前有结束日期,您使用的是哪种RDBMS?除了Nicks观察。。。在哪种情况下,您希望两个间隔在同一组中?它们之间存在“重叠间隔路径”?嗯,我想这闻起来像是带语句的递归或类似的东西