|
|
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
Всех приветствую, возник такой вопрос, необходимо сагрегировать суммы в иерархическом запросе. Имеется некая иерархия: "Блоки/Контрагенты/Статьи/Счета", иерархия настроена определенным образом как этого хочет видеть заказчик. Соответственно, при присоединении данных к иерархии суммы в рублях у меня находятся в самых нижних уровнях иерархии. Задача - получить агрегированные суммы по иерархии. Например, я делаю селект: Код: plaintext 1. 2. 3. 4. и получаю нечто вроде: Код: plaintext 1. 2. 3. 4. 5. А хотелось бы Код: plaintext 1. 2. 3. 4. 5. Притом, гонять иерархию на расчет каждой суммы (сумма иерархии от парент-нода текущей строки в иерархии) не хотелось бы - увеличение времени работы сложного запроса, практика показала, что на больших данных могут еще и нехорошие ошибки вываливаться. Также не пойдет метод джоина с группировкой по каждой строке иерархии по полям Блок/контрагент/статьи/счета, т.к. могут быть сложные правила соединения (например, по определенным дополнительным условиям данные попадают в другой блок), а потом заворачивание на иерархию. Самым простым я тут вижу написание функции по типу sys_connect_by_path, но суммирующую суммы с дочерних нодов (допускается с суммой текущего нода для простоты). Но чтото не могу сообразить как это сделать. Помогите разобраться :) Пс: Oracle 9i ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 08:22 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
chameleon82, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 09:19 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
Вложенный деревянный запрос: Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 09:35 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
-2-, к сожалению апгрейд исключен. Продакшен сервер с офф.поддержкой, на 10ку нет денег. 2Добрый Э-эх. Я изначально решил задачу точно таким же методом, но, к сожалению, время работы его заметно увеличилось, при больших объемах вываливается too old snapshot или еще какая-нибудь нехорошая вещь. Материализовать подзапрос также не предоставляется возможным изза вероятности выпадения ошибки нехватки temp. Поэтому нужно какое-нибудь элегантное решение. Есть конечно вариант через промежуточную temp таблицу, но очень хотелось бы без нее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 10:41 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
chameleon82, Почему бы не хранить нужные тебе суммы в той же таблице? Один раз столбец просчитаешь, дальше выборка будет мгновенная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 10:46 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
chameleon82, Если уровень вложенности ограничен udf_evaluate(sys_connect_by_path(amount, '+')) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 10:54 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
Alocky, Иерархия - это наборы значений, там свои поля добавлять нельзя - да и не нужно это - т.к. система многопользовательская. Реальные данные, которые соединяются с этой иерархией, сгруппированные данные порядка мильона строк. Фактически эти сгруппированные данные - это еще один более нижний уровень, т.к. пользователь может запросить и детализацию (в разных блоках группировка по разным критериям может быть). Хотя есть вариант, на который вы меня навели: сделать временную таблицу, в нее сгрузить и иерархию, и сгруппированные данные со ссылкой на парент_ид, потом все это завернуть в отчет. Однако это не решает моей задачи. Пересчет каждого нода все равно надо делать :) Хотя в данном случае snapshoot too old практически сводится к минимальным шансам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 10:56 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
chameleon82 Иерархия - это наборы значений, там свои поля добавлять нельзя - да и не нужно это - т.к. система многопользовательская. Что-то связи не увидел chameleon82 Пересчет каждого нода все равно надо делать Конечно надо, кто ж спорит. Решать это можно по-разному, тут от задачи зависит. Общих рекомендаций, думаю, не существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 11:02 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
-2-chameleon82, Если уровень вложенности ограничен udf_evaluate(sys_connect_by_path(amount, '+')) Нет функции udf_evaluate, google не помогает :( Что это за функция? Если суммы собираются с нижних уровней к верхним, то в качестве решения пойдет. Уровень вложенности не более 5-6ти, так что в этом плане так же пойдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 11:05 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
ALockychameleon82 Иерархия - это наборы значений, там свои поля добавлять нельзя - да и не нужно это - т.к. система многопользовательская. Что-то связи не увидел OeBS, иерархию можно получить в виде вьюшки. Если повесить поле сумма на какой-нибудь атрибут, то что произойдет, если два пользователя запустят отчет одновременно? Fail. В общем я хотел бы решение, похожее на приведенное -2-, возможно с помощью самописной аналитической функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 11:09 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
chameleon82Нет функции udf_evaluate, google не помогает :( Что это за функция? Если суммы собираются с нижних уровней к верхним, то в качестве решения пойдет. Уровень вложенности не более 5-6ти, так что в этом плане так же пойдет.Что за функция, можно было догадаться из названия, но собирает она действительно сверху вниз - не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 11:15 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
-2-Что за функция, можно было догадаться из названия, но собирает она действительно сверху вниз - не подходит. По названию то я догадался ), но в нашей 9i ее нет ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 11:18 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
здесь писал лет 5 назад используем принцип в сотнях отчетов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 11:25 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
chameleon82, без двойной деревяшки - это так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 11:32 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
Не знаю, будет ли быстрее пять-шесть over(partition by ...) Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 11:33 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
-2-, sys_connect_by_path(id,'/') -> sys_connect_by_path('*','/') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 11:34 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
-2-, черт... в общем, выровнять id на фиксированную длину ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 11:35 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
В общем придумал такую вещь :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 13:00 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
^^^ Кстати, в этом виде все равно просчитывается для каждого нода :( а используются ли повторно вычисленные значения по иерархии - не знаю как проверить? Если да - то замечательно, если нет, то видимо все равно тормоза будут. Пс: в реальной иерархии порядка 50-100 нодов, с детализацией может быть до 1000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 13:10 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
Без анала и моделей: Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 13:51 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
Решение интересное Однако std.subword - опять же с 10ки? или что за пакет? заменил на substr, вроде работает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 14:02 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
chameleon82Однако std.subword - опять же с 10ки?Нет еще с семерки тяну на каждую БД, где пасусь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 14:08 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
От having можно попробовать избавиться через grouping sets, но не допер как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 14:10 |
|
||
|
Агрегация сумм в иерархических запросах
|
|||
|---|---|---|---|
|
#18+
-2-От having можно попробовать избавиться через grouping sets, но не допер как. Указать необходимые в выводе сочетания строк ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 15:09 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=36727974&tid=1885841]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
444ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
92ms |
get tp. blocked users: |
2ms |
| others: | 237ms |
| total: | 828ms |

| 0 / 0 |
