Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите пжл с отбором интервалом в таблице / 7 сообщений из 7, страница 1 из 1
04.07.2017, 23:36
    #39482826
Mashennik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжл с отбором интервалом в таблице
Добрый вечерю
Подскажите пожалуйста как отобрать общее время когда система была нагружена.
У меня есть таблица. Миниатура:
CREATE TABLE tasks (
taskid NUMBER(5) PRIMARY KEY,
projectid NUMBER(5),
start_fact date,
end_fact date,
oper_name date);
INSERT INTO tasks
VALUES (1, 101, TO_DATE('2017/07/04 01:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/04 01:44:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM');
INSERT INTO tasks
VALUES (2, 101, TO_DATE('2017/07/04 02:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/04 11:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM');
INSERT INTO tasks
VALUES (3, 101, TO_DATE('2017/07/04 02:01:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/04 03:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM');
INSERT INTO tasks
VALUES (4, 101, TO_DATE('2017/07/04 17:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/04 21:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM');
INSERT INTO tasks
VALUES (5, 101, TO_DATE('2017/07/04 21:06:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/04 23:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM');
INSERT INTO tasks
VALUES (6, 102, TO_DATE('2017/07/03 00:09:24', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 02:00:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM');
INSERT INTO tasks
VALUES (7, 102, TO_DATE('2017/07/03 01:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 11:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM');
INSERT INTO tasks
VALUES (8, 102, TO_DATE('2017/07/03 02:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 03:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM');
INSERT INTO tasks
VALUES (9, 102, TO_DATE('2017/07/03 17:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 21:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM');
INSERT INTO tasks
VALUES (10, 102, TO_DATE('2017/07/03 21:06:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 22:07:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM');


Как видно из таблицы есть процессы с датой начала и датой конца за день. Некоторые из них работают и пересекаются друг с другом. Мне нужно высчитать время работы системы в общем т.е. если смотреть на с 1 по 5 id то это время от сумма 2017/07/04 01:02:44
до 2017/07/04 01:44:44 , с 2017/07/04 02:01:44 по 2017/07/04 11:02:44, с 2017/07/04 17:02:44 по 2017/07/04 21:02:44 и 2017/07/03 21:06:44 по 2017/07/03 22:07:44.

Задача была бы проще если б надо было посчитать просто время всех процессов ( в минутах например)

select (MAX(END_FACT)-MIN(START_FACT))*1440 as "Время загрузки" from tasks group by projectid

Но в данном случае нужно просто общее время нагрузки процессами системы.
У мысль одна взять максимальное время окончание вычесть минимальное время начало и потом каким то образом вырезать время простоя. Но как его найти не могу понять. Просьба помочь друзья)
...
Рейтинг: 0 / 0
05.07.2017, 04:30
    #39482873
Помогите пжл с отбором интервалом в таблице
Mashennik,

склеить малые пересекающиеся интервалы в один большой. дальше посчитать сумму длин больших непересекающихся интервалов.
пример слияния интервалов , с картинками
...
Рейтинг: 0 / 0
05.07.2017, 08:29
    #39482907
Mashennik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжл с отбором интервалом в таблице
Добрый Э - ЭхMashennik,

склеить малые пересекающиеся интервалы в один большой. дальше посчитать сумму длин больших непересекающихся интервалов.
пример слияния интервалов , с картинками
Спасибо, сегодня попробую)
...
Рейтинг: 0 / 0
05.07.2017, 09:08
    #39482923
Помогите пжл с отбором интервалом в таблице
Mashennik,

а чего там пробовать? делать надо!
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
with tasks as (
select 1 as taskid, 101 as projectid, TO_DATE('2017/07/04 01:02:44', 'yyyy/mm/dd hh24:mi:ss') as start_fact,TO_DATE('2017/07/04 01:44:44', 'yyyy/mm/dd hh24:mi:ss') as end_fact,'LTM' as oper_name from dual union all
select 2, 101, TO_DATE('2017/07/04 02:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/04 11:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 3, 101, TO_DATE('2017/07/04 02:01:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/04 03:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 4, 101, TO_DATE('2017/07/04 17:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/04 21:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 5, 101, TO_DATE('2017/07/04 21:06:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/04 23:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 6, 102, TO_DATE('2017/07/03 00:09:24', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 02:00:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 7, 102, TO_DATE('2017/07/03 01:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 11:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 8, 102, TO_DATE('2017/07/03 02:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 03:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 9, 102, TO_DATE('2017/07/03 17:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 21:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 10, 102, TO_DATE('2017/07/03 21:06:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 22:07:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual)
--
--
select trunc(sum(max(e) - min(b))) ||' day(s) '||
       to_char(trunc(sysdate) + sum(max(e) - min(b)),'fmhh24" hour(s) "mi" minute(s) "ss" second(s)"') as total_time
  from (
         select b, e, sum(sog) over(order by b,e) as grp_id
           from (
                  select start_fact as b, end_fact as e, 
                         case 
                           when start_fact <= max(end_fact) over(order by start_fact, end_fact 
                                                  rows between unbounded preceding
                                                           and 1 preceding) 
                             then 0 
                           else 1 
                         end as sog
                    from tasks
                )
       )
 group by grp_id;
...
Рейтинг: 0 / 0
05.07.2017, 11:01
    #39483013
Mashennik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжл с отбором интервалом в таблице
Добрый Э - Эх,
Спасибо данный вариант работает осталось подумать как группировать данные по project_id чтобы выводить на каждый project_id время работы
...
Рейтинг: 0 / 0
05.07.2017, 11:52
    #39483065
Помогите пжл с отбором интервалом в таблице
Mashennik,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
with tasks as (
select 1 as taskid, 101 as projectid, TO_DATE('2017/07/04 01:02:44', 'yyyy/mm/dd hh24:mi:ss') as start_fact,TO_DATE('2017/07/04 01:44:44', 'yyyy/mm/dd hh24:mi:ss') as end_fact,'LTM' as oper_name from dual union all
select 2, 101, TO_DATE('2017/07/04 02:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/04 11:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 3, 101, TO_DATE('2017/07/04 02:01:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/04 03:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 4, 101, TO_DATE('2017/07/04 17:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/04 21:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 5, 101, TO_DATE('2017/07/04 21:06:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/04 23:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 6, 102, TO_DATE('2017/07/03 00:09:24', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 02:00:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 7, 102, TO_DATE('2017/07/03 01:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 11:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 8, 102, TO_DATE('2017/07/03 02:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 03:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 9, 102, TO_DATE('2017/07/03 17:02:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 21:02:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual union all 
select 10, 102, TO_DATE('2017/07/03 21:06:44', 'yyyy/mm/dd hh24:mi:ss'),TO_DATE('2017/07/03 22:07:44', 'yyyy/mm/dd hh24:mi:ss'),'LTM' from dual)
--
--
select projectid, trunc(sum(delta)) ||' day(s) '||
       to_char(trunc(sysdate) + sum(delta),'fmhh24" hour(s) "mi" minute(s) "ss" second(s)"') as total_time
  from (
         select projectid, max(e) - min(b) as delta
           from (
                  select b, e, sum(sog) over(partition by projectid order by b,e) as grp_id, projectid
                    from (
                           select projectid, start_fact as b, end_fact as e, 
                                  case 
                                    when start_fact <= max(end_fact) over(partition by projectid order by start_fact, end_fact 
                                                           rows between unbounded preceding
                                                                    and 1 preceding) 
                                      then 0 
                                    else 1 
                                  end as sog
                             from tasks
                         ) v0
                ) v1
          group by grp_id, projectid
       ) v2
 group by projectid;
...
Рейтинг: 0 / 0
05.07.2017, 22:18
    #39483428
Mashennik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжл с отбором интервалом в таблице
Добрый Э - Эх,
Спасибо вам)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите пжл с отбором интервалом в таблице / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]