SQL 查询按时间序列分组
SQL query to group by chronological series
我正在研究人们在不同时间访问不同地点的商业案例。
我需要在同一位置将每个系列分组,然后 return 将其作为一行。
为了说明,我创建并填充了table 访问(见下文)。
select loc, hour from visit order by hour
给我
Loc Hour
1 10
1 11
1 12
2 13
2 14
1 15
1 16
我想要 SQL return 如下:
Loc first last
1 10 12
2 13 14
1 15 16
建议,有人吗?
Table/例子中的数据
create table visit ( loc number(2), hour number(2) );
insert into visit (loc, hour) values (1,10);
insert into visit (loc, hour) values (1,11);
insert into visit (loc, hour) values (1,12);
insert into visit (loc, hour) values (2,13);
insert into visit (loc, hour) values (2,14);
insert into visit (loc, hour) values (1,15);
insert into visit (loc, hour) values (1,16);
这是一个典型的间隙和孤岛问题,您希望将同一位置的 "adjacent" 次访问分组在一起。
这是一种使用 row_number
s 之间的差异来解决它的方法:
select
loc,
min(hour) first_hour,
max(hour) last_hour
from (
select
t.*,
row_number() over(order by hour) rn1,
row_number() over(partition by loc order by hour) rn2
from visit t
) t
group by loc, rn1 - rn2
order by first_hour
loc | first_hour | last_hour
--: | ---------: | --------:
1 | 10 | 12
2 | 13 | 14
1 | 15 | 16
我正在研究人们在不同时间访问不同地点的商业案例。
我需要在同一位置将每个系列分组,然后 return 将其作为一行。
为了说明,我创建并填充了table 访问(见下文)。
select loc, hour from visit order by hour
给我
Loc Hour
1 10
1 11
1 12
2 13
2 14
1 15
1 16
我想要 SQL return 如下:
Loc first last
1 10 12
2 13 14
1 15 16
建议,有人吗?
Table/例子中的数据
create table visit ( loc number(2), hour number(2) );
insert into visit (loc, hour) values (1,10);
insert into visit (loc, hour) values (1,11);
insert into visit (loc, hour) values (1,12);
insert into visit (loc, hour) values (2,13);
insert into visit (loc, hour) values (2,14);
insert into visit (loc, hour) values (1,15);
insert into visit (loc, hour) values (1,16);
这是一个典型的间隙和孤岛问题,您希望将同一位置的 "adjacent" 次访问分组在一起。
这是一种使用 row_number
s 之间的差异来解决它的方法:
select
loc,
min(hour) first_hour,
max(hour) last_hour
from (
select
t.*,
row_number() over(order by hour) rn1,
row_number() over(partition by loc order by hour) rn2
from visit t
) t
group by loc, rn1 - rn2
order by first_hour
loc | first_hour | last_hour --: | ---------: | --------: 1 | 10 | 12 2 | 13 | 14 1 | 15 | 16