|
|
|
Группировка по времени на не фиксированные промежутки
|
|||
|---|---|---|---|
|
#18+
Добрый день. Уважаемые гуру, помогите пожалуйста со следующей задачей. Имеем таблицу с неким логом падений устройств, стоящих на мониторинге (даже скорее не логом, а с активными событиями, т.к. поле device уникально): event_id device time1Switch42013-09-01 00:01:002Switch12013-09-01 00:02:303Switch102013-09-01 00:02:404Switch512013-09-01 03:05:005Switch492013-09-02 13:00:006Switch282013-09-02 13:01:007Switch92013-09-02 13:02:00 Устройства как правило "падают" либо по 1-му, либо группой (в случае если "падает" узловое оборудование), но в случае падаения группой - записи заноситься в эту систему не с одинаковым TIMESTAMP'ом, а с разницей примерно +/-3 минуты . Задача стоит в том чтобы проанализировать лог и разделить события по группам(общим авариям) в зависимости от времени, но так чтобы перед первым и последним падением не прошло более 3-х минут (т.е. имеем не фиксированные промежутки времени). Я представляю себе это выделением дополнительной колонки в которой будем группировать устройства по времени падения +/-3 минуты, т.е event_id device time group1Switch42013-09-01 00:01:00 12Switch12013-09-01 00:02:30 13Switch102013-09-01 00:02:40 14Switch512013-09-01 03:05:00 25Switch492013-09-02 13:00:00 36Switch282013-09-02 13:01:00 37Switch92013-09-02 13:02:00 3 Первое что приходит на ум это использование оконных функций, но к сожалению в выражении автор[ RANGE | ROWS ] BETWEEN frame_start AND frame_end нельзя указывать что-то отличное от авторUNBOUNDED PRECEDING value PRECEDING CURRENT ROW value FOLLOWING UNBOUNDED FOLLOWING где value авторvalue must be an integer expression not containing any variables, aggregate functions, or window functions Да и подумав пришёл к выводу, что даже возможность указывать INTERVAL это не помогла бы. Прошу помощи у Вас, возможно кто-то сталкивался с подобным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2013, 11:59:20 |
|
||
|
Группировка по времени на не фиксированные промежутки
|
|||
|---|---|---|---|
|
#18+
SkyFire, 1) сначала бегите по окну на всю выборку упорядоченную по временем и смотрите разницу с лагом, и если эта разница для строки больше интервала (например, 2 минуты), то помечаем это временем строки. 2)после первого прохода делаем второй, все пустые руонамберы запоняем лоагом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2013, 12:24:23 |
|
||
|
Группировка по времени на не фиксированные промежутки
|
|||
|---|---|---|---|
|
#18+
Misha Tyurin, недописал. --- 1) сначала бегите по окну на всю выборку упорядоченную по временем и смотрите разницу с лагом, и если эта разница для строки больше интервала (например, 2 минуты), то помечаем это временем строки. 2) после первого прохода делаем второй, все пустые отметки заполняем "максимальной" 3) и третий Код: 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. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2013, 12:46:54 |
|
||
|
Группировка по времени на не фиксированные промежутки
|
|||
|---|---|---|---|
|
#18+
Misha Tyurin, http://www.depesz.com/2010/09/12/how-to-group-messages-into-chats/ всё придумано до нас ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2013, 12:51:28 |
|
||
|
Группировка по времени на не фиксированные промежутки
|
|||
|---|---|---|---|
|
#18+
Misha Tyurin, то что нужно! Огромнейшее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2013, 14:17:18 |
|
||
|
Группировка по времени на не фиксированные промежутки
|
|||
|---|---|---|---|
|
#18+
Если кому ещё пригодится - на СО предложили тоже интересные решения. http://stackoverflow.com/questions/18782363/group-by-floating-date-range ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2013, 15:19:43 |
|
||
|
Группировка по времени на не фиксированные промежутки
|
|||
|---|---|---|---|
|
#18+
Грез было не поделиться элегантным решением... Итак 3 дня искал решение, но все, что нашел - было достаточно громоздко. В итоге решил поискать округление по датам и нашел функцию, которая округляла не совсем так как надо ( http://wiki.postgresql.org/wiki/Round_time) Вот здесь функция огругления по интервалу. Немного доработал ф-ю и получил то что надо Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. А далее просто группируем по результатам функции: Код: sql 1. Соответственно меняем интервал округления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2014, 09:44:38 |
|
||
|
Группировка по времени на не фиксированные промежутки
|
|||
|---|---|---|---|
|
#18+
khuawei, Ток начал переходить на эту субд, поэтому интересно Код: sql 1. 2. Код: sql 1. 2. 3. 4. 5. тут случаем ничего нельзя сократить? или это скрытая реклама автопреобразования типов? а главное, не подходит для данной задачи. понаходить логи за интервалы времени, и разбить шкалу времени на интервалы, и на основании этого разбиения групировать - это не одно и тоже!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2014, 16:45:15 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38395893&tid=1998630]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
45ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 190ms |
| total: | 305ms |

| 0 / 0 |
