powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / подсчет длительности интервала, исключая предыдущие интервалы
15 сообщений из 40, страница 2 из 2
подсчет длительности интервала, исключая предыдущие интервалы
    #39545153
Stax,

Да, нужно исключать предыдущие интервалы. Про точность - не совсем понял.
Точность в часах
...
Рейтинг: 0 / 0
подсчет длительности интервала, исключая предыдущие интервалы
    #39545232
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hans Christian AndersenStax,

Да, нужно исключать предыдущие интервалы. Про точность - не совсем понял.
Точность в часах
напр 20.02.2017 11:00:00' и 20.02.2017 14:00:00

генерим (любым способом)
20.02.2017 11:00:01
20.02.2017 12:00:01
20.02.2017 13:00:01

берем токо те строки которые не входят(не пересекаются) ни в один предыдущий диапазон,
сумируем (count(*))

мне не нравится такой вариант, ето простой перебор, енергозатратный метод
но реализовать очень просто

если надо могу нарисовать, но на практике врядли надо пользовать

но можно попробовать, а вдруг подойдет

.....
stax
...
Рейтинг: 0 / 0
подсчет длительности интервала, исключая предыдущие интервалы
    #39545233
StaxStaxподенно считать не походит?
.....
stax

"по денно" имел ввиду точность с которой задается старт/стоп (час/минута/секунда)

.....
stax

точность с которой задается старт/стоп: HH24:MI:SS
...
Рейтинг: 0 / 0
подсчет длительности интервала, исключая предыдущие интервалы
    #39545241
Stax,

вы наверное не совсем поняли задание:

Исходные данные:

Код: plaintext
1.
2.
3.
4.
   WORK_ID    TEAM_ID START_DATE            END_DATE              DURATION_IN_HOURS
---------- ---------- --------------------- --------------------- -----------------------------------
         2          1 21-02-2017 12:00:00   21-02-2017 15:00:00                   3
         2          2 21-02-2017 10:00:00   21-02-2017 16:00:00                   3
         2          3 21-02-2017 13:00:00   21-02-2017 18:00:00                   2

Исходные данные в виде временного отрезка


1.........................12/////////////15...........................
2...............10//////////////////////////16.....................
3...............................13//////////////////////18..........

Результат

1.........................12//////////////15.......................... Результат 3
2...............10//////12..............15////16.................. Результат 3
3...................................................16//////18........ Результат 2
...
Рейтинг: 0 / 0
подсчет длительности интервала, исключая предыдущие интервалы
    #39545298
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hans Christian AndersenStax,

вы наверное не совсем поняли задание:



надеюсь что понял
пока (без перебора) не знаю нак реализовать

ведь предыдущие диапазоны, могут разбить текущий на н частей

.....
stax
...
Рейтинг: 0 / 0
подсчет длительности интервала, исключая предыдущие интервалы
    #39545326
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxпока (без перебора) не знаю нак реализовать Разбивка периодов дат по приоритетам
...
Рейтинг: 0 / 0
подсчет длительности интервала, исключая предыдущие интервалы
    #39545336
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hans Christian AndersenStaxпропущено...


"по денно" имел ввиду точность с которой задается старт/стоп (час/минута/секунда)

.....
stax

точность с которой задается старт/стоп: HH24:MI:SS

c учетом
авторТочность в часах

не понял

но то и неважно, если решение перебором отбрасываем

.....
stax
...
Рейтинг: 0 / 0
подсчет длительности интервала, исключая предыдущие интервалы
    #39545344
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

понятно что надо "обьеденить" интервалы и
учесть подинтервальчики с "уровнем вложености" 1

.....
stax
...
Рейтинг: 0 / 0
подсчет длительности интервала, исключая предыдущие интервалы
    #39545360
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hans Christian Andersen,

все вроде все проще
счас попробую реализовать

10-13 и 13-20 пересекаются?

.....
stax
...
Рейтинг: 0 / 0
подсчет длительности интервала, исключая предыдущие интервалы
    #39545382
StaxHans Christian Andersen,

все вроде все проще
счас попробую реализовать

10-13 и 13-20 пересекаются?

.....
stax

Нет,
Результат будет
3
7
...
Рейтинг: 0 / 0
подсчет длительности интервала, исключая предыдущие интервалы
    #39545402
StaxHans Christian AndersenStax,

вы наверное не совсем поняли задание:



надеюсь что понял
пока (без перебора) не знаю нак реализовать

ведь предыдущие диапазоны, могут разбить текущий на н частей

.....
stax

Да, в этом и была загвоздка.
Теперь понял, что нужно разбивать такие отрезки на подинтервалы.
...
Рейтинг: 0 / 0
подсчет длительности интервала, исключая предыдущие интервалы
    #39545403
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hans Christian Andersen,

алгоритм такой
для каждой записи
1)берем предыдущие которые пересекаются
2)сворачиваем методом Добрейшего Э - Эха
3)сумируем полученное в п2
4)отнимаем от текущего

набивать код?

.....
stax
...
Рейтинг: 0 / 0
подсчет длительности интервала, исключая предыдущие интервалы
    #39545412
StaxHans Christian Andersen,

алгоритм такой
для каждой записи
1)берем предыдущие которые пересекаются
2)сворачиваем методом Добрейшего Э - Эха
3)сумируем полученное в п2
4)отнимаем от текущего

набивать код?

.....
stax

Да, но только если вас сильно от других дел не отвлечет.
Вы , и так, много сделали. Спасибо вам!
. Я доберусь до компа только через 6 часов.
Попробую свой вариант.
...
Рейтинг: 0 / 0
подсчет длительности интервала, исключая предыдущие интервалы
    #39545466
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hans Christian Andersen,

сортировку не менял,
там просто чуть поменяется and t2.team_id(+)<t1.team_id

алгоритм Доброго Еха, взял с ссылки (ctrl+c/v)
получился такой монстрик

Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
with t
as
(
--Объект Work_id 1-------------------------------------------------------------------------------------------------------------------------------------------------------------------
select 1 WORK_ID, 1 as team_id, 8 START_DATE, 14 as END_DATE, 1 sort_id, 3 as DURATION_IN_HOURS  from dual
UNION ALL
select  1 WORK_ID,2 as team_id, 07 START_DATE, 15 as END_DATE, 2 sort_id, 4 as DURATION_IN_HOURS  from dual 
UNION ALL
select 1 WORK_ID, 3 as team_id, 10 START_DATE, 17 as END_DATE, 2 sort_id, 3 as DURATION_IN_HOURS  from dual
UNION ALL
select 1 WORK_ID, 4 as team_id, 14 START_DATE, 22 as END_DATE, 2 sort_id, 4 as DURATION_IN_HOURS   from dual
UNION ALL --Объект Work_id 2-------------------------------------------------------------------------------------------------------------------------------------------------------
select 2 WORK_ID, 1 as team_id, 12 START_DATE, 15 as END_DATE, 1 sort_id, 3 as DURATION_IN_HOURS   from dual
UNION ALL
select 2 WORK_ID, 2 as team_id, 10 START_DATE, 16 as END_DATE, 2 sort_id, 3 as DURATION_IN_HOURS   from dual 
UNION ALL
select 2 WORK_ID, 3 as team_id, 13 START_DATE, 18 as END_DATE, 2 sort_id, 2 as DURATION_IN_HOURS   from dual 
UNION ALL
select 2 WORK_ID, 4 as team_id, 18 START_DATE, 23 as END_DATE, 2 sort_id, 5 as DURATION_IN_HOURS   from dual 
UNION ALL
select  2 WORK_ID,5 as team_id, 19 START_DATE, 22 as END_DATE, 2 sort_id, 0 as DURATION_IN_HOURS   from dual 
)
,intervals as (
select t2.team_id t2w_id
,greatest(t1.start_date,t2.start_date) b
,least(t1.end_date,t2.end_date) e
,t1.* from t t1,t t2
where t2.work_id(+)=t1.work_id and t2.team_id(+)<t1.team_id
and t1.start_date<t2.end_date(+) and t2.start_date(+)<t1.end_date --пересекаются
)
select work_id,team_id
      ,max(start_date) start_date,max(end_date) end_date
      ,sum(x_e-x_b) delta
      ,(max(end_date)-max(start_date))-nvl(sum(x_e-x_b),0) work_time
from
(select work_id,team_id,grp_id,min(b) as x_b, max(e) as x_e
       ,max(start_date) start_date,max(end_date) end_date
  from (
         select i2.*, sum(sog) over(partition by work_id,team_id order by b,e) as grp_id
           from (
                  select i.*, 
                         case 
                           when b <= max(e) over(partition by work_id,team_id order by b, e 
                                                  rows between unbounded preceding
                                                           and 1 preceding) 
                             then 0 
                           else 1 
                         end as sog -- sog = start_of_group :)
                    from intervals i
                ) i2
       ) 
 group by work_id,team_id,grp_id
)group by work_id,team_id
order by work_id,team_id
--,t2w_id
/
SQL> /

   WORK_ID    TEAM_ID START_DATE   END_DATE      DELTA  WORK_TIME
---------- ---------- ---------- ---------- ---------- ----------
         1          1          8         14                     6
         1          2          7         15          6          2
         1          3         10         17          5          2
         1          4         14         22          3          5
         2          1         12         15                     3
         2          2         10         16          3          3
         2          3         13         18          3          2
         2          4         18         23                     5
         2          5         19         22          3          0

9 rows selected.



проверяйте

.....
stax
...
Рейтинг: 0 / 0
подсчет длительности интервала, исключая предыдущие интервалы
    #39545477
Stax,

Крутоооо!
Спасибо!
...
Рейтинг: 0 / 0
15 сообщений из 40, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / подсчет длительности интервала, исключая предыдущие интервалы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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