В ответе есть несколько вариантов, которые будут работать, вот тот, который использует функцию Oracle « Windowing с логическим смещением » вместо соединений или коррелированных подзапросов.
Первая таблица испытаний:
Wrote file afiedt.buf
1 create table t pctfree 0 nologging as
2 select date '2011-09-15' + level / (24 * 4) as date_page_requested
3 from dual
4* connect by level <= (24 * 4)
SQL> /
Table created.
SQL> insert into t values (to_date('2011-09-15 11:11:11', 'YYYY-MM-DD HH24:Mi:SS'));
1 row created.
SQL> commit;
Commit complete.
T теперь содержит строку каждый четверть часа в течение дня с одной дополнительной строкой в 11:11:11. Запрос выполняется в три этапа. Шаг 1 состоит в том, чтобы получить для каждой строки число строк, приходящих в течение следующего часа после времени строки:
1 with x as (select date_page_requested
2 , count(*) over (order by date_page_requested
3 range between current row
4 and interval '1' hour following) as hour_count
5 from t)
Затем назначьте порядок по часам:
6 , y as (select date_page_requested
7 , hour_count
8 , row_number() over (order by hour_count desc, date_page_requested asc) as rn
9 from x)
И, наконец, выберите самую раннюю строку с наибольшим количеством следующих строк.
10 select to_char(date_page_requested, 'YYYY-MM-DD HH24:Mi:SS')
11 , hour_count
12 from y
13* where rn = 1
Если несколько часов по 60 минутам связаны в счетчике часов, вышеприведенное даст вам только первое окно.