powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите пжл с отбором интервалом в таблице
7 сообщений из 7, страница 1 из 1
Помогите пжл с отбором интервалом в таблице
    #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
Помогите пжл с отбором интервалом в таблице
    #39482873
Mashennik,

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

склеить малые пересекающиеся интервалы в один большой. дальше посчитать сумму длин больших непересекающихся интервалов.
пример слияния интервалов , с картинками
Спасибо, сегодня попробую)
...
Рейтинг: 0 / 0
Помогите пжл с отбором интервалом в таблице
    #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
Помогите пжл с отбором интервалом в таблице
    #39483013
Mashennik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,
Спасибо данный вариант работает осталось подумать как группировать данные по project_id чтобы выводить на каждый project_id время работы
...
Рейтинг: 0 / 0
Помогите пжл с отбором интервалом в таблице
    #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
Помогите пжл с отбором интервалом в таблице
    #39483428
Mashennik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,
Спасибо вам)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите пжл с отбором интервалом в таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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