|
Как решить на sql
|
|||
---|---|---|---|
#18+
Есть некие отрезки a-b с типом 1, которые могут не пересекаться, могут частично или полностью включать друг друга. Отрезки с типом 1 могут быть закрыты отрезком с типом 2. Нужно в разрезе каждой даты выделить новые отрезки с учетом истории изменения длин этих отрезков. Как реализовать одним запросом? Oracle 11.2 Исходные данные: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Нужно получить: Код: 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.
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 15:09 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
tira mi su, "обеденить" пересекающиеся интервальчики (Добрый Ех с рисунками показывал как) и допилить с учетом загадочного "Отрезки с типом 1 могут быть закрыты отрезком с типом 2." .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 15:27 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
Забыл указать столбец типа результата... Нужно получить: Код: 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.
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 15:30 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
Слава богу.... А то я думал, что с ума сошёл ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 15:35 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
tira mi su, ой приврал, Вам не надо обьеденять интервальчики, а наоборот ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 15:36 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
Хотя по колонке с описанием вопросы остались ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 15:39 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
а зачем это делать одним запросом? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 16:46 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
andreymxа зачем это делать одним запросом? Академический интерес. Реально ли и если реально, то посмотреть решение. Сам не осилил. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 17:04 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
tira mi suandreymxа зачем это делать одним запросом? Академический интерес. Реально ли и если реально, то посмотреть решение. Сам не осилил. попробовать рекурсивно (относительно дат) вызывать алгоритм Доброго Эха, или другой обьеденения интервалов будет пауза попытаюсь .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 17:16 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
Staxtira mi suпропущено... Академический интерес. Реально ли и если реально, то посмотреть решение. Сам не осилил. попробовать рекурсивно (относительно дат) вызывать алгоритм Доброго Эха, или другой обьеденения интервалов будет пауза попытаюсь .... staxи разъединения :) тип 2 не забываем ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 18:02 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
А если добавлены сразу два пересекающихся отрезка, как отображать ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 18:20 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
tira mi su, что-то хреново с постановкой задачи и примером. tira mi suНужно получить: Код: 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.
Посмотри на картинку и объясни как, что и откуда должно появляться ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2019, 03:18 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
tira mi su, сравни с результатом этого запроса: Код: 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.
TYPEDT2P_STARTP_END11976-11-301689169211979-11-041688168911979-11-041689169211979-11-041692169511982-11-041674.5168311982-11-041686.5168811982-11-041688168911982-11-041689169111982-11-041691169211982-11-041692169511982-11-051674.5168311982-11-051686.51686.611982-11-051686.6168811982-11-051688168911982-11-051689169111982-11-051691169211982-11-051692169511982-11-0516951695.112001-04-271673.51674.512001-04-271674.5168312001-04-2716831683.512001-04-271686.51686.612001-04-271686.6168812001-04-271688168912001-04-271689169112001-04-271691169212001-04-271692169512001-04-2716951695.112010-04-121673.51674.512010-04-121674.5168312010-04-1216831683.512010-04-121686.51686.612010-04-121686.6168812010-04-121688168912010-04-121689169022010-04-121690169422010-04-121694169512010-04-1216951695.112012-12-011673.51674.512012-12-011674.5168312012-12-0116831683.512012-12-011686.51686.612012-12-011686.6168812012-12-011688168912012-12-011689169022012-12-011690169112012-12-011691169212012-12-011692169212012-12-011692169312012-12-011693169422012-12-011694169512012-12-0116951695.1 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2019, 03:20 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
xtendertira mi su, что-то хреново с постановкой задачи и примером. Посмотри на картинку и объясни как, что и откуда должно появляться спасибо за картинку, так проще я понял задачу так тип 1 0) обьеденяем интервалы первого дня (в примере один интервл то пропускаем) 1) идем по днях (начинаем со второго 04.11.1979 ) 2) обьеденяем интервалы текущего дня с результатом расчета предыдущего (все итервалы с начала по текущий) 3) следующий день и п2 все что попадает в интервал тип2 удаляем (с учетом пересечений) если ето так как я описал можно попробовать использовать алгоритм типа ДоброгоЭха добавив "partition" если отрезки не обеденять, то их к-во должно токо расти, а ж нет (напр 05.11.1982) зы имхо для теста проще пример делать на небольших целых числах (напр с 1 по то 100) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2019, 09:23 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
что-то в таком видеStaxимхо для теста проще пример делать на небольших целых числах (напр с 1 по то 100) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
TYPEDTABVIS101/01/200147----###-102/01/200168------##103/01/200112-#------103/01/200135---##--- Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2019, 09:39 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
andreymxчто-то в таком виде я б для теста даж MAX(b) over() заменил на константу ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2019, 09:49 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
andreymxчто-то в таком виде a-b включно чутку подправил Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2019, 10:05 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
Staxя понял задачу так тип 1 0) обьеденяем интервалы первого дня (в примере один интервл то пропускаем) 1) идем по днях (начинаем со второго 04.11.1979 ) 2) обьеденяем интервалы текущего дня с результатом расчета предыдущего (все итервалы с начала по текущий) 3) следующий день и п2из исходного примера видно, что сворачивать/объединять интервалы не нужно. Наоборот, их надо разбить Staxесли ето так как я описал можно попробовать использовать алгоритм типа ДоброгоЭха добавив "partition"про что речь? если про разложение интервала в список точек с помощью генераторов с последующей сверткой, то это не пойдет как из-за нецелых чисел, так и в целом из-за отсутствия необходимости сворачивания интервалов. Исходную задачу можно еще решить геморройным рекурсивным with, но на большом кол-ве строк это умрет ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2019, 13:08 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
xtenderИсходную задачу можно еще решить геморройным рекурсивным with, но на большом кол-ве строк это умретТС вроде говорил об академическом интересе ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2019, 13:47 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
xtenderпро что речь? если про разложение интервала в список точек с помощью генераторов с последующей сверткой нет не об разложении просто я не понимаю что надо сделать если "их надо разбить", то к-во должно увеличиватся (как в Вашем решении), но для 05.11.1982 их всего 4 ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2019, 14:23 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
Staxесли "их надо разбить", то к-во должно увеличиватся (как в Вашем решении), но для 05.11.1982 их всего 4за 05.11.1982 было 2, а стало 4 - разве это не увеличение? другое дело, что по постановке задаче и примеру с другими строками(например, за 04.11.1979), должно быть еще больше, но, видимо, "потеряли"... Я же выше уже спрашивал: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2019, 20:54 |
|
Как решить на sql
|
|||
---|---|---|---|
#18+
Конечно ваши замечания по предоставленному мной результату верные. У каждого отрезка есть свои атрибуты, которые дополнительно вычисляются у результирующих отрезков, поэтому замечания "04.11.1982 1688 1691 -- почему сразу 1691? куда 1689 потеряли?" верные. Например, один из дополнительных атрибутов(кол-во точек) нового отрезка должен вычисляться как максимальное значение за историю жизни этого кусочка от начала жизни до текущей строки. Смежные отрезки с одинаковыми атрибутами, в конечном итоге нужно будет соединить. Также нужно учитывать интервалы с типом "закрыт". После появления вторичного отрезка начинается занового его жить, но только в переделе интервала закрыт. Т.е. он может быть добавлен, пересечен и т.д. до следующего частичного или полного закрытия. Если вторичный отрезок больше закрытого, то учитывается история с самого начала. Задачи три: получить новые отрезки, определить тип отрезков и рассчитать дополнительные атрибуты. Прошу прощение, за то что выпал из топика. Был занят неотложными делами. Постараюсь на выходных более наглядно сформулировать постановку с картинками и нормальными данными. Спасибо за понимание. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2019, 10:23 |
|
|
start [/forum/topic.php?fid=52&msg=39799934&tid=1882588]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 290ms |
total: | 433ms |
0 / 0 |