|
распределение периодов по непересекающимся группам
|
|||
---|---|---|---|
#18+
Есть таблица содержащая определенные периоды времени, нужно разбить эти периоды на группы таким образом что бы каждая группа содержала только не пересекающиеся периоды. Количество групп должно быть минимальными. model и match_recognize использовать нельзя т.к. решение должно работать и на Oracle и на Postgres У меня получилось приблизительно такое решение: Код: 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.
результат вроде похож на правду (поле gr содержит искомый номер группы для периода), но у решения есть ряд недостатков: 1. Оно не правильно будет работать для совпадающих по дате начала периодов (пример закомментированный период с id = 7) в принципе этот недостаток я могу обойти доработав данное решение 2. Боюсь что быстродействие у данного решения будет не очень хорошим, особенно учитывая что у меня будет порядка несколько сотен тысяч периодов и результат нужно получать достаточно быстро. Введение дополнительного условия на начало ветвления (стоить дерево нужно только для периодов имеющих пересечения) конечно поможет, но возможно есть лучшие варианты или подходы? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 15:13 |
|
распределение периодов по непересекающимся группам
|
|||
---|---|---|---|
#18+
ln123, для отладки легче воспринимаются диапазоны в числах я б делал примерно так 1) обьеденил пересекающиеся 2)к-во групп будет равно максимальному к-ву диапазончиков в обьеденившем 3) переномеровал диапазночики в рамках обьедененных (порядковый номер ето искомая группа) все ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 15:24 |
|
распределение периодов по непересекающимся группам
|
|||
---|---|---|---|
#18+
Stax, Либо я вас не до конца понял либо так работать не будет. Рассмотрим пример (для удобства числовой): 0-5, 4-7, 6-8 объединяем, получаем один период 0-8 в котором 3 периода т.е. при вашем подходе мы получаем 3 группы однако, их на самом деле 2: Первая 0-5 и 6-8 и вторая 4-7 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2020, 15:37 |
|
|
start [/forum/topic.php?fid=52&fpage=28&tid=1880554]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 261ms |
total: | 400ms |
0 / 0 |