|
|
|
помогите средствами вендоронезависимого ANSI SQL-99 посчитать длительность состояния
|
|||
|---|---|---|---|
|
#18+
Всем привет. Есть набор датчиков (device_id) и результаты измерения их статусов (dev_status) в заданное время (timestamp) (см.пример в таблице ниже). timestampdevice_iddev_status05/11/2016 16:301ok05/11/2016 17:001ok05/11/2016 17:301err05/11/2016 18:001err05/11/2016 18:301ok05/11/2016 19:001ok05/11/2016 19:301err05/11/2016 20:001ok05/11/2016 20:301ok05/11/2016 16:002ok05/11/2016 16:302err05/11/2016 17:002ok05/11/2016 17:302ok05/11/2016 18:002err05/11/2016 18:302ok05/11/2016 19:002err05/11/2016 19:302err05/11/2016 20:002err05/11/2016 20:302ok Мне надо в отдельном столбце получить сколько времени прошло с момента перехода девайса в состояние "err" из состояния "ok". При этом, если девайс из состояния "err" снова перешел в состояние "ok", то счетчик обнуляется. Мой план решения (просьба не пинать очень уж сильно): 1) в дополнительном столбце (err_cntr_state) проставить флаги старта счетчика состояния "ашипка" (переходы dev_status из состояния "ok" в "err") и его остановки (переходы dev_status из состояния "err" в "ok"). 2) в другом дополнительном столбце (err_cntr_value) нарастающим итогом вывести требуемую длительность состояния "ашипка". Т.е. получить нечто вроде такого: timestampdevice_iddev_statuserr_cntr_stateerr_cntr_value05/11/2016 16:301ok05/11/2016 17:001ok05/11/2016 17:301errstart005/11/2016 18:001errstop00:3005/11/2016 18:301ok05/11/2016 19:001ok05/11/2016 19:301err05/11/2016 20:001ok05/11/2016 20:301ok05/11/2016 16:002ok05/11/2016 16:302err05/11/2016 17:002ok05/11/2016 17:302ok05/11/2016 18:002err05/11/2016 18:302ok05/11/2016 19:002errstart005/11/2016 19:302err00:3005/11/2016 20:002errstop01:0005/11/2016 20:302ok Вопросы: 1) С п.1. из плана я справился: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. но на реализации п.2. потух. Прошу помощи. 2) Есть основания полагать, что выбранный вариант решения не вполне изящен с т.з. реальных профи SQL. Подскажите пожалуйста, по каким ключевым словам копать в верном направлении. На самом деле кручу данные на вертике, т.о. некоторые аналитические функции доступны, а если буду хорошо себя вести, то наши dba еще и права на создание процедур и функций моей схеме дадут :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2017, 13:56 |
|
||
|
помогите средствами вендоронезависимого ANSI SQL-99 посчитать длительность состояния
|
|||
|---|---|---|---|
|
#18+
evgenius_b, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Что-то такое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2017, 14:41 |
|
||
|
помогите средствами вендоронезависимого ANSI SQL-99 посчитать длительность состояния
|
|||
|---|---|---|---|
|
#18+
env, ага, спасибо, почти то, что нужно. В предложенном решении показывается длительность каждого интервала в состоянии false, осталось только просуммировать полученные значения. Я правильно понял принцип - сначала в дополнительном столбце grp проставляем номер группы следующих друг за другом смен состояний по каждому девайсу, затем суммируем по номеру группы и девайсу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2017, 15:31 |
|
||
|
помогите средствами вендоронезависимого ANSI SQL-99 посчитать длительность состояния
|
|||
|---|---|---|---|
|
#18+
evgenius_b, попробуй привести через два with ... select ... набор входных данных и ожидаемый результат, возможно я не правильно понял твою задачу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2017, 16:50 |
|
||
|
помогите средствами вендоронезависимого ANSI SQL-99 посчитать длительность состояния
|
|||
|---|---|---|---|
|
#18+
env, и поищи по форуму start_of_group, т.к. два row_number не всегда дадут корректную группу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2017, 17:01 |
|
||
|
помогите средствами вендоронезависимого ANSI SQL-99 посчитать длительность состояния
|
|||
|---|---|---|---|
|
#18+
env, Извиняюсь, оракла под рукой нет, поэтому пишу псевдокод, не помню как оформить время в минутах в столбце err_cntr_value: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. В столбце err_cntr_value выводится нарастающим итогом время работы в режиме err (ед.измерения часы, но можно любое, смогу перевести), но только в случаях, когда эти ошибки смежные, т.е. следуют друг за другом. в Других случаях (после возврата из состояния err в состояние ок) таймер обнуляется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2017, 17:19 |
|
||
|
помогите средствами вендоронезависимого ANSI SQL-99 посчитать длительность состояния
|
|||
|---|---|---|---|
|
#18+
Всем спасибо, особенно env! Поиск по форуму start_of_group помог корректно пронумеровать каждую группу изменений состояния каждого девайса в течение дня. Затем для каждой группы с меткой error вычислил нужное время (максимальный timestamp - минимальный timestamp). Получилось что-то вроде этого (код для вертики): Код: sql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2017, 14:20 |
|
||
|
|

start [/forum/topic.php?fid=52&tid=1886644]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
154ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 462ms |

| 0 / 0 |
