2015-08-06 5 views
0

Я должен разделить прошедшее время процесса на слоты равных размеров и рассчитать количество строк, вставленных в каждый временной интервал.Разделить период времени на разделы и рассчитать средние значения

Вот DDL таблицы

ID     number 
    insert_date_time date 

Примеры данных

101   Aug 1 2015 4:43:00 PM 
    931   Aug 1 2015 4:43:01 PM 

Выход Ищу выглядит следующим образом

Time Slot   Rows Inserted 
4:00 pm - 5:00 pm  103 
5:00 pm - 6:00 pm  95 
6:00 pm - 7:00 pm  643 

(я оставил из даты часть для кратность)

Точно так же, я должен выяснить, сколько времени каждый из 100 строк взяли

0 - 100 rows  4:00pm - 4:43pm 
    101 - 200 rows  4:43pm - 5:58pm 

Я знаю функция Oracle OLAP может быть использована для этого, но не знает, как?

+1

Пожалуйста, покажите, как данные представлены в таблицах. – OldProgrammer

+0

Формат записи очень прост. Всего два столбца - идентификатор (номер) и insert_date_time (дата) – oradbanj

+0

Дата не является интервалом. Пожалуйста, ** отредактируйте ** свой вопрос, а не комментарии, и покажите show EXACT образцовое представление данных вашей таблицы. – OldProgrammer

ответ

0

Если вы ищете 1-часовые разделы, вы можете просто обрезать столбец даты, который вы смотрите на час trunc(your_date_col, 'hour'), используя это укороченное значение в предложении группировки.

Для 2-го требования вы можете разбивать строки с помощью запроса, как это:

with data as (
select a.your_date_col 
    , row_number() over (order by Your_Date_Col) rn 
    , row_number() over (order by Your_Date_Col) - 
     mod(row_number() over (order by Your_Date_Col)-1,50) grp 
    from your_table a 
) 
select min(rn) ||' - ' 
    ||max(rn) ||' rows' rows 
    , min(your_date_col)||' - ' 
    ||max(your_date_col) time_range 
    from data 
group by grp 
1

Надеясь я понял ваше требование.

Первый Req #:

SELECT TO_CHAR(INSERT_TIME,'HH24'),COUNT(*) FROM TABLE 
GROUP BY TO_CHAR(INSERT_TIME,'HH24'); 

Второй Req #:

SELECT ROUND((ROW_NUMBER-1)/100,0), 
MIN(INSERT_TIME)  +'-'+ MAX(INSERT_TIME) 
FROM TABLE 
GROUP BY ROUND((ROW_NUMBER-1)/100,0); 
+0

Я предпочитаю, чтобы вы сгруппировали записи во втором вопросе лучше, чем я сделал это. – Sentinel

Смежные вопросы