如何按日期时间字段计算行数并划分为时间间隔

Iva*_*ich 6 oracle oracle-10g count

我正在使用 Oracle 数据库 10g。有一个包含有关客户信息的表格:

 +----+------+---------------------+
 | id | name |    registered_at    |
 +----+------+---------------------+
 |  1 | Ivan | 2016/08/01 15:09:01 |
 |  2 | Alex | 2016/08/01 16:30:21 |
 |  3 | John | 2016/08/01 16:31:05 |
 |  4 | Hugo | 2016/08/01 15:08:00 |
 |  5 | Anna | 2016/08/01 15:42:23 |
 +----+------+---------------------+
Run Code Online (Sandbox Code Playgroud)

如何按regitered_at给定间隔(以分钟为单位)按列计算记录?

例如:间隔 = 10 分钟,日期时间范围从2016/08/01 15:00:002016/08/01 17:00:00. 结果应该是这样的:

+---------------------+---------------------+-----+
|        start_       |         end_        | cnt |
+---------------------+---------------------+-----+
| 2016/08/01 15:00:00 | 2016/08/01 15:10:00 |   2 |
| 2016/08/01 15:40:00 | 2016/08/01 15:50:00 |   1 |
| 2016/08/01 16:30:00 | 2016/08/01 16:40:00 |   2 |
+---------------------+---------------------+-----+
Run Code Online (Sandbox Code Playgroud)

桌子:

create table clients (
  id number(10) not null,
  name varchar2(30) not null,
  registered_at DATE
);
Run Code Online (Sandbox Code Playgroud)

数据:

insert into clients 
  (id, name, registered_at) 
values 
  (1, 'Ivan', to_date('2016/08/01 15:09:01', 'YYYY/MM/DD HH24:MI:SS'));

insert into clients 
  (id, name, registered_at) 
values 
  (2, 'Alex', to_date('2016/08/01 16:30:21', 'YYYY/MM/DD HH24:MI:SS'));

insert into clients 
  (id, name, registered_at) 
values 
  (3, 'John', to_date('2016/08/01 16:31:05', 'YYYY/MM/DD HH24:MI:SS'));

insert into clients 
  (id, name, registered_at) 
values 
  (4, 'Hugo', to_date('2016/08/01 15:08:00', 'YYYY/MM/DD HH24:MI:SS'));

insert into clients 
  (id, name, registered_at) 
values 
  (5, 'Anna', to_date('2016/08/01 15:42:23', 'YYYY/MM/DD HH24:MI:SS'));
Run Code Online (Sandbox Code Playgroud)

Bal*_*app 4

variable interval_minutes number;

exec :interval_minutes := 10;

select
  trunc(registered_at, 'HH24')
  + trunc(to_char(registered_at,'mi')/:interval_minutes)*:interval_minutes/1440, 
  count(*) 
from
  clients
group by 
  trunc(registered_at, 'HH24')
  + trunc(to_char(registered_at,'mi')/:interval_minutes)*:interval_minutes/1440
order by 
  1
;
Run Code Online (Sandbox Code Playgroud)

基于:汇总一段时间内的数据 - 按时间间隔