|
|
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Помогите решить задачу с помощью SQL (желательно средствами oracle 10g), которая очень легко решается с помощью обычного цикла и переменной в PL/SQL. Есть таблица: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Все id необходимо отсортировать по группам в зависимости от значений val. Разница между значением (поле val) последнего элемента группы и первого элемента группы не должно превышать 0.5. То есть результирующий запрос должен выдать следующее (res - группа): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2018, 22:15 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
В указанных ограничениях (10g, SQL) можете попробовать модельку: https://www.oracle.com/technetwork/middleware/bi-foundation/10gr1-twp-bi-dw-sqlmodel-131067.pdf Если смягчить условия на "чистый SQL" - то оформите pipelined функцией и не морочьте голову. Если допустить более свежие версии rdbms - то добавится pattern matching А так - творчество ради творчества - можно и на 9i SQL порешать, поищите на форуме "задачу о рюкзаке", "задачу коммивояжера"... Проникайтесь и Творите :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2018, 23:47 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 02:07 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
-2-, Я Вашего алгоритма честно, не понял. Но вроде все просто можно сделать. сначала определяем границы перехода Код: sql 1. А потом любым методом посчитать нарастающий итог. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 07:12 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
тут же не разницу первого элемента предшествующей группы и первого элемента новой группы, а "последнего элемента группы и первого элемента группы" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 07:15 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
Хотя тестовый пример просчитан именно по алгоритму "Разница между первым элементом предшествующей группы и первым элементом новой группы" <=0.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 07:18 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
Только хардкор, никаких вам аналитик! Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Искомая колонка ord2. Дальше сами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 08:11 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
Павел Воронцов, Не для всех данных работает корректно. Но разберитесь сами, там просто вроде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 08:28 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
Павел Воронцовразберитесь самиreset running total в sql решается через рекурсию connect by/with, model или match_recognize. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 08:45 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
-2-, Отличный ответ. Немного изменил запрос что-бы работал с любым первым элементом (не обязательно ноль). Код: 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. Немного поясню суть Вашей идеи. Иерархическим подзапросом находятся все первые элементы групп (соответственно проставляется номер группы): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 09:52 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
982183-2-, Я Вашего алгоритма честно, не понял. Но вроде все просто можно сделать. сначала определяем границы перехода Код: sql 1. А потом любым методом посчитать нарастающий итог. Я так и пробовал. Но из-за того что нужно запоминать первый элемент группы (а не предыдущую запись), функция LAG не спасала ситуацию. Код: 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. Не определено начало группы 6,25. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 10:01 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
EnergomarketНо из-за того что нужно запоминать первый элемент группы (а не предыдущую запись), ну так далее я и говорю о том, что в постановке не "первый элемент группы", а "последний" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 10:25 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
EnergomarketНе определено начало группы 6,25. 6,25-5,83=0,42 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 10:27 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
-2-Павел Воронцовразберитесь самиreset running total в sql решается через рекурсию connect by/with, model или match_recognize.Я не спорю, но у меня вон решилось. Когда и если голова перестанет болеть, допилю для любого набора данных. Хотя... Похоже, что без рекурсии не обойтись. Подумаю ещё. В Вашем решении меня смущает Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 10:45 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
Energomarket, Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 11:08 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
Павел Воронцов-2-пропущено... reset running total в sql решается через рекурсию connect by/with, model или match_recognize.Я не спорю, но у меня вон решилось. Когда и если голова перестанет болеть, допилю для любого набора данных. Хотя... Похоже, что без рекурсии не обойтись. Подумаю ещё.[/src]Когда голова перестанет болеть, возможно, придет понимание почему никакими SQL-методами, кроме перечисленных -2- задача нерешаема. PS. Ну можно извратиться еще через XML. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 11:15 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
982183EnergomarketНе определено начало группы 6,25. 6,25-5,83=0,42 Первый элемент группы 5,67. 6,25-5,67=0,58 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 11:32 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
третий раз пишу, что в постановке авторРазница между значением (поле val) последнего элемента группы и первого элемента группы не должно превышать 0.5. и исправлений постановки не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 11:41 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
Всё. До меня дошло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 11:42 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopникакими SQL-методами, кроме перечисленных -2- задача нерешаема. rownum/group by/order by достаточно для решения этой задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 15:59 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
SkilledJuniordbms_photoshopникакими SQL-методами, кроме перечисленных -2- задача нерешаема. rownum/group by/order by достаточно для решения этой задачи.Классно. Ты ж и показать сможешь, да? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 16:25 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopSkilledJuniorпропущено... rownum/group by/order by достаточно для решения этой задачи.Классно. Ты ж и показать сможешь, да? Ну вот, оторвал человека от дел - он теперь пару часов угрохает на заведомую ерунду, а затем наспамит тут десяток datamagic-specific вариантов... в лучшем случае налепит свой вариант connect by/subquery factoring :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 16:42 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopпочему никакими SQL-методами, кроме перечисленных -2- задача нерешаема. -2- вроде "перечислил" всего один метод. andrey_anonymous подкинул еще. Recursive subquery factoring вроде не упоминали. Ну а в 12C как намекнул andrey_anonymous все куда проще: Код: 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. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 17:22 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
SY, Я еще могу понять когда человек не в состоянии осилить тему. Но когда это касается одного сообщения на которое он отвечает... 21688712 21688856 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 17:57 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousнаспамит тут десяток datamagic-specific вариантовЭто очень лестная характеристика опытного Жуниора. Я ставлю на то, что в его случае всё ограничится пустой болтовней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 17:58 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopКлассно. Ты ж и показать сможешь, да? Видишь суслика? Нет? А он есть)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 21:11 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
SkilledJuniordbms_photoshopКлассно. Ты ж и показать сможешь, да? Видишь суслика? Нет? А он есть)) Судя по всему там джойн на таблицу чисел по копеечкам, применительно к данным ТС, но правда, если точность cap далеко за сотые, то... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2018, 01:40 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, Да, сегодня голова не болит и я согласен - только рекурсия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2018, 07:30 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorВидишь суслика? Нет? А он есть)) Пятница прошла давно и пятничный суслик убежал, гениев SQL не обнаружено (( Павел Воронцовdbms_photoshop, Да, сегодня голова не болит и я согласен - только рекурсия. Задача не имеет не итеративных решений, рекурсия кривой метод реализации итераций, нормальный метод озвучил: andrey_anonymousоформите pipelined функцией и не морочьте голову. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2018, 00:09 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#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. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2018, 01:11 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
Energomarketсредствами oracle 10g SkilledJuniorНа вентилятор ... Код: plsql 1. Код: plsql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2018, 15:41 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, Без PRAGMA UDF пакетный вариант будет работать и в десятке, больше ничего в таком решении не смущает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2018, 22:56 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorбольше ничего в таком решении не смущает?SQL сам накажет самовлюблённых гениёв за использование функций с побочными эффектами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 07:41 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
Elic, Да, для пользовательских функций Oracle не гарантирует ни нужную последовательность ни количество вызовов для каждой строки, хотя сам вполне себе генерирует псевдостолбец rownu, т.е. механизм имеется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 23:22 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorхотя сам вполне себе генерирует псевдостолбец rownu, т.е. механизм имеется.Бред. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 07:53 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorдля пользовательских функций если уж браться за plsql, то за обычный или полиморфный pipeline. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 08:46 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
PTF Код: 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. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 10:55 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
-2- Код: plsql 1. 2. Записал, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 18:32 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
ElicБред.Сформировать rownum можно либо имея доступ к тому же столбцу предыдущей строки, либо сохраняя последний присвоенный номер в переменную, при этом необходимо гарантировать последовательность прохода по выборке и отсутствие увеличения счетчика более одного раза для одной и той же строки. Оба механизма реализуют итеративный инкремент по выборке и подошли бы для решения задачи. -2-если уж браться за plsql, то за обычный или полиморфный pipeline. Да я и не спорю: SkilledJuniorЗадача не имеет не итеративных решений, рекурсия кривой метод реализации итераций, нормальный метод озвучил: andrey_anonymousоформите pipelined функцией и не морочьте голову. Полиморфный метод зачетный, кинул в избранное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2018, 14:06 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
SkilledJunior, Ты точно понял первые два-три слова отсюда, формирователь? dbms_photoshopникакими SQL-методами, кроме перечисленных -2- задача нерешаема Хорошо хоть сам написал, что Оракл не гарантирует последовательность вызова функций. Даже лень проверять будет ли устойчив эффект при параллельном выполнении. Слишком тухлый вброс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2018, 14:30 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopДаже лень проверять будет ли устойчив эффект при параллельном выполнении. Банальный пример, конечное не будет устойчив, другие примеры нарушения последовательности были бы более интересны, а примеры многократного вызова функции для одной и той же строки еще интереснее. Еще интересный вопрос, что сделает rownum без сортировки и rownum from (select ... order by) с параллельным выполнением запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2018, 15:25 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorдругие примеры нарушения последовательности Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2018, 16:02 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorпримеры многократного вызова функции для одной и той же строки еще интереснее.Вспоминаются примеры недовызова. 16679179 (хотя rownum это как раз "лечит") SkilledJuniorЕще интересный вопрос, что сделает rownum без сортировки и rownum from (select ... order by) с параллельным выполнением запроса.При параллельности ты не управляешь тем какие порции данных идут в какой slave не говоря уже про то, что любые попытки использовать stateful пакеты бессмысленны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2018, 16:04 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopПри параллельности ты не управляешь тем какие порции данных идут в какой slave не говоря уже про то, что любые попытки использовать stateful пакеты бессмысленны. Эээ... Вообще-то это, скажем так, не совсем правда по обоим пунктам. По крайней мере, я и управлял распределением по слейвам, и успешно использовал statefull... Но не в контексте решения юниора, ессно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2018, 16:35 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
-2-, Хороший пример, однако rownum Oracle формирует правильно)) dbms_photoshopВспоминаются примеры недовызова. 16679179 (хотя rownum это как раз "лечит") Ох уж этот экономный Oracle, но все же в примере одна и та же функция с одними и теми же параметрами в разных столбцах, но не в одном столбце разных строк. SkilledJuniorПри параллельности ты не управляешь тем какие порции данных идут в какой slave не говоря уже про то, что любые попытки использовать stateful пакеты бессмысленны. Вопрос был несколько иной, даст ли rownum и rownum на отсортированной выборке использовать параллельность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2018, 16:41 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopПри параллельности ты не управляешь тем какие порции данных идут в какой slave Что говорит лишь о том что только master мoжет вычислять аналитику. Вернее только master мoжет производить сортировки указанные в аналитике. А можeт ли он потом опять наплодить slaves? Мне пока не удалось создать такой план но это ничего не значит. Это может появится в новых версиях а может я просто плохой повар. Но в любом случае я с тобой полностью согласен только ORDER BY гарантирует порядок строк. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2018, 16:45 |
|
||
|
reset running total / Задача определения "плавающих" групп
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousdbms_photoshopПри параллельности ты не управляешь тем какие порции данных идут в какой slave не говоря уже про то, что любые попытки использовать stateful пакеты бессмысленны. Эээ... Вообще-то это, скажем так, не совсем правда по обоим пунктам. По крайней мере, я и управлял распределением по слейвам, и успешно использовал statefull... Но не в контексте решения юниора, ессно :)Речь шла про решение Жуниора single row function , а не про любителей явно указывать как распределять данные в пайплайне или еще чего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2018, 17:05 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1883366]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
147ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
78ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 490ms |

| 0 / 0 |
