|
|
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
Подскажите, можно ли добиться от wm_concat предсказуемого поведения (Oracle 10g) или если нужен упорядоченный список, то эта функция в принципе не подходит? Допустим я делаю так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Этот запрос (с закомментированной сортировкой в подзапросе) возвращает неупорядоченный список клиентов. Если я включаю сортировку в подзапросе (раскомментирую), то как мне кажется, у Oracle нет причин переставлять значения при сортировке и список клиентов должен получится упорядоченным. В целом он действительно упорядочен, однако не совсем. Первая половина списка упорядочена по возрастанию, вторая половина списка в основном упорядочена по убыванию, но не всегда. Примены: 0097,0104,0130,0631,1132,2577,2831,3354,5394, 3198,2770,1471,1057,0420 1094,4311,4831,5432,6339, 5186,4352,3148,1134,2681,2990 Этому есть какое-то объяснение? Или недокументированную функцию тут использовать нельзя и следует использовать model или xmlagg? ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 11:07 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
Используйте listagg(client,',') WITHIN GROUP (ORDER BY...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 11:19 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
Разве listagg не с 11 версии появился? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 11:20 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
Alibek B.Разве listagg не с 11 версии появился? До того были кастомные реализации - поищите stragg ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 11:28 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
Alibek B., Напиши свой агрегат с программной сортировкой внутри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 11:31 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
Ну своя реализация это перебор, тогда уж лучше модель использовать. Просто я надеялся, что тут можно wm_concat приспособить, мне простота ее использования нравится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 11:53 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
Alibek B.Ну своя реализация это перебор Два часа работы + новый полезный опыт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 13:05 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#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. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. Функция GROUP_CONCAT работает (идентично WM_CONCAT), т.е. строки соединяет, но не сортирует. Не могу понять, как реализовать сортировку. По идее, для этого должен быть интерфейс ODCIAggregateCompare (в котором я задаю логику сравнения элементов), но этого интерфейса в ODCIAggregate нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2016, 09:54 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
Alibek B.По идее, для этого должен быть интерфейс ODCIAggregateCompareИ какие, по твоему, параметры должны быть у этого интерфейса, когда вызваться и что делать в реализации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2016, 12:34 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
Обычно в подобных интерфейсах передается два сравниваемых значения (объекта), а реализация интерфейса должна вернуть результат их сравнения (первый больше второго, второй больше первого, они равны). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2016, 12:57 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
Alibek B., Как вариант, убрать метод ODCIAggregateMerge, тогда он не будет знать, как складывать результат иначе, чем в порядке прохода (который закрепить с помощью order by). Другой вариант, результат складывать не в total varchar2, а в коллекцию, на выходе внутри ODCIAggregateTerminate уже сортировать и складывать в varchar2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2016, 13:22 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
Alibek B.Обычно в подобных интерфейсах передается два сравниваемых значения (объекта), а реализация интерфейса должна вернуть результат их сравнения (первый больше второго, второй больше первого, они равны).И дальше что агрегатор должен делать с этим "больше"? Ты путаешь с методами объектных типов order/map, которые вызываются явной сортировкой order by ASC/DESC NULLS FIRST/LAST. При этом попарное сравнение order применимо только в неэффективных алгоритмах сортировки с большим количеством сравнений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2016, 14:35 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
-2-Ты путаешь с методами объектных типов order/map, которые вызываются явной сортировкой order by ASC/DESC NULLS FIRST/LAST. При этом попарное сравнение order применимо только в неэффективных алгоритмах сортировки с большим количеством сравнений. Да, теперь понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2016, 14:42 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
Alibek B.Не могу понять, как реализовать сортировку. А зачем придумывать велосипед. Убери MERGE и: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2016, 14:42 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#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. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2016, 03:43 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
А еще пацаны collect прикручивают http://stackoverflow.com/questions/9279718/ordered-iteration-in-an-user-defined-aggregate-function ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2016, 03:46 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousСорри за ленивый код.не проще ли тогда сортировать в iterate. andrey_anonymouscollect прикручиваютxmlagg(','||)+.extract+ltrim столько-же-буквенно, но без дополнительных функций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2016, 06:41 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
дфяян ыщкене проще ли тогда сортировать в iterate. Если я правильно понял, то ленивость заключается в том, что в iterate вместо индексирования просто проставляются последовательные номера. А в terminate осуществляется не сортировка, а выборка данных по индексу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2016, 10:43 |
|
||
|
Вопрос про wm_concat и сортировку
|
|||
|---|---|---|---|
|
#18+
Alibek B.дфяян ыщкене проще ли тогда сортировать в iterate. Если я правильно понял, то ленивость заключается в том, что в iterate вместо индексирования просто проставляются последовательные номера. А в terminate осуществляется не сортировка, а выборка данных по индексу. Нет. Ленивость - в том, что я поленился кодить сортировку и вместо сортировки использовал ассоциативный массив, что удвоило необходимую память. Кроме того, этот подход не дает возможности сделать linguistic sort. И еще одно Нет: в iterate не "проставляются последовательные номера", а подсчитываются дубликаты - нигде не сказано, что сортируемое множество уникально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2016, 13:04 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39325032&tid=1887229]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
159ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 430ms |

| 0 / 0 |
