|
|
|
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 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39709581&tid=1883366]: |
0ms |
get settings: |
4ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
148ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 433ms |

| 0 / 0 |
