|
Задачка. Аналитика с выражением по условию?
|
|||
---|---|---|---|
#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.
Здесь steps - это и есть отдельная таблица, т.е. кол-во шагов и значения второго аргумента заранее не определены. Можно ли это как-то выразить в SQL? Если, скажем, заранее известно, что кол-во операций будет не больше трёх, я могу написать что-то типа такого: Код: 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.
И это работает, но выглядит очень громоздко (кол-во операций в case на самом деле около 10). Интуитивно хочется этот case "воткнуть" в аналитическую функцию с нарастающим итогом, но я не придумал, как подставлять результат вычисления с предыдущего шага в текущий. Рекурсивного SQL в Oracle вроде как нет. С вариантом connect by level стройного и красивого ничего не получается придумать. Есть у кого какие идеи? Или ну его? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2020, 22:58 |
|
Задачка. Аналитика с выражением по условию?
|
|||
---|---|---|---|
#18+
delphinotes Рекурсивного SQL в Oracle вроде как нет. Очень даже есть - Recursive Subquery Factoring: Код: 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.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2020, 23:45 |
|
Задачка. Аналитика с выражением по условию?
|
|||
---|---|---|---|
#18+
Еще есть вариант использовать вычисления в xmlquery/xmltable, которые стали существенно быстрее в новых версиях, но нужно использовать именно xquery-операторы, которые немного отличаются, например. +,-,* так и останутся, но деление / надо поменять на div. Простой пример: в calc мы собираем полное выражение по всем шагам Код: 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.
И остается его только выполнить над данными: от 1 до 10 Код: 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.
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 00:22 |
|
Задачка. Аналитика с выражением по условию?
|
|||
---|---|---|---|
#18+
xtender Простой пример: в calc мы собираем полное выражение по всем шагам Не забываем про вычитание (знак минус окажется непосредственно за переменной): Код: 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.
Исправляем: Код: 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.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 02:39 |
|
Задачка. Аналитика с выражением по условию?
|
|||
---|---|---|---|
#18+
SY, Круто, спасибо! Жаль в 10ке не работает, зато в 11й - уже. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 09:07 |
|
Задачка. Аналитика с выражением по условию?
|
|||
---|---|---|---|
#18+
xtender, Это вообще супер, оно работает даже быстрее рекурсивного. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 09:17 |
|
Задачка. Аналитика с выражением по условию?
|
|||
---|---|---|---|
#18+
Хм.. с выводами я поторопился, при использовании функций ceiling, floor и т.п. xmlquery начинает проседать, да и порядок следования аргументов меняется - собрать итоговое выражение в listagg наверное можно, но оно будет слишком громоздким. Остановлюсь на варианте с рекурсией как наиболее читаемой и более гибкой к расширению. Ещё раз спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 10:34 |
|
Задачка. Аналитика с выражением по условию?
|
|||
---|---|---|---|
#18+
delphinotes, объясните, что вы вообще делаете? почему именно пошагово? не проще было бы сразу указывать финальное выражение? Покажите, какие у вас там операторы есть и какие аргументы вы подставляете в arg? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 13:47 |
|
Задачка. Аналитика с выражением по условию?
|
|||
---|---|---|---|
#18+
xtender, Это легаси, пытаюсь оптимизировать с обратной совместимостью. В подавляющем большинстве случаев конструктор выражений, который даётся на откуп пользователю, сводится к простому выражению... т.е. действительно, вместо произвольной последовательности выражений достаточно просто указать ряд полей - и всё легко считается в одной строке. Но бывают исключения... сейчас это всё обрабатывается pl/sql-функцией и это одно из слабых мест при пакетной обработке входных данных (переключения контекста, да). Операторы: + - * / mod, round, ceil, trunc, floor, least, greatest, кое-что из внутренней кухни... и для эстетов - произвольное выражение через execute immediate :) Аргументы - это константы, в некоторых случаях на вход подаётся не одно значение, а два и операторы могут брать одно из них, или сразу оба. Короче, топик больше из спортивного интереса, так то я склоняюсь к пересмотру этого "конструктора". ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 16:30 |
|
Задачка. Аналитика с выражением по условию?
|
|||
---|---|---|---|
#18+
delphinotes Операторы: + - * / mod, round, ceil, trunc, floor, least, greatest, кое-что из внутренней кухни... и для эстетов - произвольное выражение через execute immediate :) Ну тогда забудь про XQUERY. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 16:41 |
|
Задачка. Аналитика с выражением по условию?
|
|||
---|---|---|---|
#18+
delphinotes сейчас это всё обрабатывается pl/sql-функцией и это одно из слабых мест при пакетной обработке входных данных (переключения контекста, да). А вот постоянный парсинг одного и того же выражения (что на sql, что на pl/sql) - это бесполезная трата времени. Рассмотри предкомпиляцию выражения в готовый к исполнению анонимный блок. Это точно выстрелит. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 16:48 |
|
Задачка. Аналитика с выражением по условию?
|
|||
---|---|---|---|
#18+
Elic, С юбилейным комментом! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 17:55 |
|
Задачка. Аналитика с выражением по условию?
|
|||
---|---|---|---|
#18+
еще SQL Macro можно рассмотреть с Oracle 19.7 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 18:08 |
|
Задачка. Аналитика с выражением по условию?
|
|||
---|---|---|---|
#18+
xtender еще SQL Macro можно рассмотреть с Oracle 19.7 SQL Macro прекрасная обертка на ODCI table interface и с ними не надо тратить кучу времени на писанину ODCITableDescribe, ODCITablePrepare, ODCITableFetch... но как и ODCI table interface "страдает" от soft parse и посему параметры придется передавать литералом. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 18:37 |
|
|
start [/forum/topic.php?fid=52&fpage=29&tid=1880569]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 152ms |
0 / 0 |