按时间顺序分组的 SQL 查询

标签 sql database aggregate-functions window-functions gaps-and-islands

我正在研究一个商业案例,其中人们在不同时间访问不同的地点。

我需要在同一位置对每个系列进行分组并将其作为一行返回。

为了说明,我创建并填充了表格visit(见下文)。

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:

Loc first last
1 10 12
2 13 14
1 15 16

有什么建议吗?


示例中的表/数据

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);

最佳答案

这是一个典型的间隙和孤岛问题,您希望将同一位置的“相邻”访问分组在一起。

这是使用row_number之间的差异来解决它的一种方法:

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

Demo on DB Fiddle :

loc | first_hour | last_hour
--: | ---------: | --------:
  1 |         10 |        12
  2 |         13 |        14
  1 |         15 |        16

关于按时间顺序分组的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60340573/

相关文章:

mysql - 如何将查询结果放入另一个查询的结果中?

mysql - 从表 B 中选择与表 A 匹配的所有值

SQL Server 在多个字段上进行透视

c# - 在 C# .Net 软件中使用 my_sql 数据库的更好方法是什么?

mysql - 如何使行成为动态列?

c# - Entity Framework Core 5 : configuring many to many relationships, 如何指定外键名称

postgresql - 如何选择带左外连接的最小 UUID?

python - 如何检索 panda 分组数据框中的聚合值

sql - Express SQL UNION 查询 Rails 方式

scala - 如何在 Spark SQL 中定义和使用用户定义的聚合函数?