|
Выделение интервалов в последовательности
|
|||
---|---|---|---|
#18+
Коллеги, приветствую! Помогите решить задачку, не знаю, с какой стороны подступиться. Имеется некая таблица событий: Код: 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.
Инцидентом называется последовательность событий, относящихся к одному id, и случившихся последовательно по времени, так, что временной интервал между предыдущим и последующим событиями не превышает 10 минут. Задача - выделить инциденты, присвоив им уникальный номер, например - перенумеровав эти инциденты последовательно. Например, в примере выше, инцидентом будет: Niddt112020-01-01 10:00:01212020-01-01 10:00:05312020-01-01 10:00:06412020-01-01 10:01:001212020-01-01 10:01:011312020-01-01 10:02:011412020-01-01 10:10:01 Ему, например, можно присвоить номер NN = 1 Проблема осложняется тем, что в исходной таблице ~100 млн. записей, поэтому хотелось бы производительное решение, но, для начала - сгодиться любое. SQL2016, но сгодится любой. Помогите, затупил... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2021, 14:44 |
|
Выделение интервалов в последовательности
|
|||
---|---|---|---|
#18+
Не наглядный пример привел, прошу прощения. Длительность инцидента - не 10 минут! Он может и сутки, и месяц длиться. Событие принадлежит инциденту, если найдется хоть одно событие, связанное с этим Id, расстояние по времени до которого - меньше 10 минут. Если это изолированное событие, до которого больше 10 минут и вверх и вниз - то это само по себе инцидент, из одного события. Т.е. это вроде бы gap and island, но без перекрытия/примыкания. Не могу додумать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2021, 15:01 |
|
Выделение интервалов в последовательности
|
|||
---|---|---|---|
#18+
lead , lag никак не прикрутить? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2021, 15:02 |
|
Выделение интервалов в последовательности
|
|||
---|---|---|---|
#18+
Тут где-то aleks222 давал простой алгоритм поиска групп пересекающихся событий: начало группы - дата начала отдельного события, которая не попадает ни в один из диапазонов конец группы - ближайшая дата окончания отдельного события, которая не попадает ни в один из диапазонов все, что внутри этого диапазона, одна группа событий вам нужно просто добавить сюда свой десятиминутный лаг и разделение по id ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2021, 15:09 |
|
Выделение интервалов в последовательности
|
|||
---|---|---|---|
#18+
Konst_One lead , lag никак не прикрутить? Так вопрос то как раз в том, как именно прикрутить :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2021, 15:10 |
|
Выделение интервалов в последовательности
|
|||
---|---|---|---|
#18+
uaggster Konst_One lead , lag никак не прикрутить? Так вопрос то как раз в том, как именно прикрутить :-) Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2021, 15:16 |
|
Выделение интервалов в последовательности
|
|||
---|---|---|---|
#18+
msLex Тут где-то aleks222 давал простой алгоритм поиска групп пересекающихся событий: начало группы - дата начала отдельного события, которая не попадает ни в один из диапазонов конец группы - ближайшая дата окончания отдельного события, которая не попадает ни в один из диапазонов все, что внутри этого диапазона, одна группа событий вам нужно просто добавить сюда свой десятиминутный лаг и разделение по id Вот жеж. У вас не интервалы, а атомарные события, и всякие "поглощения" тут не нужны тогда все просто если предыдущее событие дальше чем на 10 минут - это начало инцидента если последующее событие дальше чем на 10 минут - это окончание инцидента нумеруете все "начала" и цепляете к ним все ближайшие (с учетом ID) окончания не забудьте только, что начало и окончание могут совпасть ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2021, 15:17 |
|
Выделение интервалов в последовательности
|
|||
---|---|---|---|
#18+
msLex, так перенумерую то я их легко, и предыдущий N - легко прикручу. Вопрос в том, как эти последовательности раскрутить то потом, не рекурсивно же! ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2021, 15:56 |
|
Выделение интервалов в последовательности
|
|||
---|---|---|---|
#18+
вот поиск интервалов если нужно наложить на исходную таблицу, заджойните Код: 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. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2021, 16:40 |
|
Выделение интервалов в последовательности
|
|||
---|---|---|---|
#18+
uaggster, Пронумеровать инциденты в таблице с 100 миллионов записей это одно. А что с этим дальше делать можно я не представляю. Положить пронумерованное в другую таблицу? Статистику посмотреть какую то? Искать то по номеру инцидента слишком тяжело. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2021, 18:28 |
|
Выделение интервалов в последовательности
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Плюс соответствующие индексы ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2021, 22:44 |
|
Выделение интервалов в последовательности
|
|||
---|---|---|---|
#18+
Так лучше Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
При правильном индексе будет один просмотр ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2021, 23:04 |
|
Выделение интервалов в последовательности
|
|||
---|---|---|---|
#18+
invm, спасибо, попытаюсь вкурить. Итого, как я понимаю, сначала в СТЕ строится последовательность, запись + предыдущее значение даты/времени инцидента, а потом поверх последовательности считается сумма: если расстояние до предыдущего - меньше 10 минут, то 0, в противном случае - +1. Таким образом все члены последовательности получат + N, где N - количество десятиминутных разрывов от начала последовательности. ИМХО, гениально, я б не недопёр. Я всё время вертелся вокруг rows between unbounded preceding and current row, но там феерическая дичь получалась, в т.ч. и по производительности. Спасибо, проверю, отпишусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2021, 09:24 |
|
Выделение интервалов в последовательности
|
|||
---|---|---|---|
#18+
uaggster, сколько возникает проблем, если неверно организовано хранение данных... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2021, 12:34 |
|
|
start [/forum/topic.php?fid=46&fpage=9&tid=1684107]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 152ms |
0 / 0 |