|
|
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
Уважаемые участники форума, у меня следующий вопрос, Условно - есть таблица с определенными в ней столбцами system_number varchar2(10) not null, thread_number number(1) not null, start_date date not null, end_date date null Постараюсь внятно объяснить, что тут хранится... Есть различные системы, пускай это будут система_1, система_2, система_3, система_4, каждая система может работать многопоточно. У каждого потока есть дата/время начала и окончания. Соответственно, в случае многопоточной работы системы временные интервалы пересекаются. Требуется для каждой системы в разрезе дня получить суммарное полезное время работы в секундах Грубый пример. Система_1 работала 28 апреля в двух потоках, один отработал с 11:00 до 13:00, второй с 12:00 до 14:00. если предположить, что в течение 28 апреля система_1 больше не работала, то для 28 апреля результат будет 3 часа, но не 4, т.к. периоды с 12 до 13 часов пересекаются. Понятно, что потоков может быть больше и интервалов в течение дня могут быть десятки и даже сотни. я думал-думал, как это сделать через SQL, в итоге плюнул и реализовал все хранимой функцией, но может кто подскажет, как это сделать через SQL? и можно ли? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 13:59 |
|
||
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 14:06 |
|
||
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
vaneque, слить пересекающиеся периоды в рамках одной системы в один "мегапериод" и посчитать сумму длин непересекающихся "мегапериодов" пример слияния периодов, с "картинками" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 14:10 |
|
||
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эх, Спасибо, попробую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 14:18 |
|
||
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эхvaneque, слить пересекающиеся периоды в рамках одной системы в один "мегапериод" и посчитать сумму длин непересекающихся "мегапериодов" пример слияния периодов, с "картинками" я не вникал, но судя по картинке время интервалов там не складывается, а ищется просто непрерывный интервал. ТС по моему хочет посчитать сумму всех тредов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 14:31 |
|
||
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
Не-не, все честно. в рамках одной системы могут быть пересечения как раз из-за того, что много тредов работает, мне нужно как раз эти треды наложить друг на друга и получить реально рабочее время, неважно, какое количество пересечений в тредах в рамках конкретной системы было roadsterДобрый Э - Эхvaneque, слить пересекающиеся периоды в рамках одной системы в один "мегапериод" и посчитать сумму длин непересекающихся "мегапериодов" пример слияния периодов, с "картинками" я не вникал, но судя по картинке время интервалов там не складывается, а ищется просто непрерывный интервал. ТС по моему хочет посчитать сумму всех тредов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 14:37 |
|
||
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
vanequeНе-не, все честно. в рамках одной системы могут быть пересечения как раз из-за того, что много тредов работает, мне нужно как раз эти треды наложить друг на друга и получить реально рабочее время, неважно, какое количество пересечений в тредах в рамках конкретной системы былозначит я не понял. думал считать что-то вроде человеко-часов надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2015, 15:13 |
|
||
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эх, спасибо огромное! :) переписал хранимку с циклом и кучей операций присваивания на иерархические запросы и запросы с оконными функциями, адаптировав твой пример под свои нужды, стало работать в 300 раз быстрее. профит! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2015, 16:27 |
|
||
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
vanequeДобрый Э - Эх, спасибо огромное! :) переписал хранимку с циклом и кучей операций присваивания на иерархические запросы и запросы с оконными функциями, адаптировав твой пример под свои нужды, стало работать в 300 раз быстрее. профит! :) імхо, время на pl/sql должно быть сравнимо, а то и быстрее ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2015, 17:38 |
|
||
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
stax.., на самом деле было сделано через одно место... у меня было 2 параметра - start_date и end_date (без времени), я в рамках процедуры организовал loop по дням и для каждого дня делал еще один loop, все эти операции по поиску нахождения пограничных точек диапазонов работы систем проводил с помощью ветвления и сохранения промежуточных значений в переменные, затем складывал разницы между вычисленными диапазонами времени, после окончания вложенного loop'а делал сохранение во временную таблицу, затем начиналась обработка следующего дня, соответственно кол-во запросов было очень большим. сейчас вообще loop'ов нет, сделал WITH, к которому left join'ом прикрепляю данные(системы теоретически могут не каждый день работать, но если не работали - надо выдать, что они работали 0 секунд, это уже дальше при суммировании разниц диапазонов полученных) Код: plsql 1. 2. 3. 4. 5. во втором loop'е тоже пропала необходимость, т.к. заюзал оконную функцию. реальная прикладная задача намного сложнее, чем я привел в примере, но мне надо было только принцип понять - можно ли это сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2015, 17:51 |
|
||
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
vanequestax.., реальная прикладная задача намного сложнее, чем я привел в примере, но мне надо было только принцип понять - можно ли это сделать. тем более, pl/sql должен виігривать тупо обьеденить пересекающиеся и "намного сложнее" ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2015, 20:14 |
|
||
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
ммм... раньше процедура работала около 4,5 с, теперь работает примерно 0.015 с. а результат абсолютно одинаковый (сохраняется в GTT). параметризованная процедура осталась, но только в качестве обертки над транзакцией, в которой от и до лежат связанные SQL запросы, работающие с присланными параметрами, необходимые для моей прикладной задачи, а циклы(в том числе вложенные) и большое количество логики исчезли. по-моему логично, что стало работать быстрее, нет? я сам писал кучу кода и проводил много code review и никогда не пропускал совершенно ненужный pl/sql, когда задачу можно решить обычным sql, эту мысль я усвоил еще давно, читая Тома Кайта. мне просто нужно было быстро решить задачу, т.к. были сроки, поэтому сделал как смог. а вообще на моей практике не припомню, чтобы обработка записей через loop'ы была быстрее, чем через SQL запросы... stax..vanequestax.., реальная прикладная задача намного сложнее, чем я привел в примере, но мне надо было только принцип понять - можно ли это сделать. тем более, pl/sql должен виігривать тупо обьеденить пересекающиеся и "намного сложнее" ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 00:09 |
|
||
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
vaneque... Грубый пример. Система_1 работала 28 апреля в двух потоках, один отработал с 11:00 до 13:00, второй с 12:00 до 14:00. если предположить, что в течение 28 апреля система_1 больше не работала, то для 28 апреля результат будет 3 часа, но не 4, т.к. периоды с 12 до 13 часов пересекаются. Понятно, что потоков может быть больше и интервалов в течение дня могут быть десятки и даже сотни. я думал-думал, как это сделать через SQL, в итоге плюнул и реализовал все хранимой функцией, но может кто подскажет, как это сделать через SQL? и можно ли? Спасибо! Как вариант решения примера: SQL Код: 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. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. Суть - разбивка анализируемого временного интервала на части с последующей проверкой на работу системы в каждой части временного интервала. Затем применение функции max для вынесения конечного решения о том, работала ли система в данной части временной интервал. После чего суммируются части временных интервалов для соответствующих систем. Если временной интервал разбить не на часы а на минуты или секунды то получится огромная конструкция SQL-запроса... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 18:38 |
|
||
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
taf, спасибо за уделенное время, но у меня там не то, что секунды, у меня вообще там таймстемпы и конструкция подобная для моей задачи будет мягко говоря неприемлема. В топике я привел пример просто для простоты, чтобы было проще понять что мне нужно. Вариант форумчанина "добрый Э-Эх" для моей задачи прекрасно подошел - оконным функциям все равно, какая там грануляция данных, SQL-конструкция краткая, гибкая, хотя и немного сложноватая для восприятия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 18:48 |
|
||
|
Сложение реального рабочего времени
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2017, 12:14 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39537966&tid=1885088]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 187ms |
| total: | 314ms |

| 0 / 0 |
