|
|
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
Всем здрасти. with a as (select 1 id, 1 srt,'txt1' txt from dual union all select 1 , 2 ,'txt2' from dual union all select 1 , 3 ,'txt3' from dual union all select 1 , 4 ,'txt4' from dual union all select 1 , 5 ,'txt5' from dual union all select 1 , 6 ,'txt6' from dual) select a.*, listagg(a.txt,', ') within group(order by a.srt) over (partition by id ) lstagg, sum(a.srt) over(partition by id order by a.srt ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) sm from a в функции sum спецификацию окна могу задать. а в листагг - никак. Так задумано или я чегото не знаю? и еще... как задать спецификацию окна чтоб в агрегации участвовали первые 10 строк партиции? наверно, не у меня одного такая проблема - ограничить количество сцепляемых строк listagg первыми n строками. Я, конечно, извратился и нашел решение. Но хотелось бы стандартными способами. без извратов. Буду благодарен любому совету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 15:54 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
bhr, Тут ноги растут прежде всего из факта, что склейка строк не коммутативная операция в отличие от других. То есть a || b <> b || a в отличие, например, от суммы или среднего. Соответственно listagg позволяет указывать сортировку результата, но не сортировку окна. С другой стороны stragg позволяет сортировать в окне, но сортировку в результирующей строке указать невозможно. Это вполне закономерно, поскольку в UDAG не предусмотрена возможность учитывать некоммутативность операции. Возвращаясь к listagg, не совсем понятно почему не сделали возможность указывать order by (и distinct, но это другая проблема и более легко решаемая). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 16:12 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
bhr, "как задать спецификацию окна чтоб в агрегации участвовали первые 10 строк партиции? " Как вариант - пронумеровать сначало row_number() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 16:18 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopbhr, Тут ноги растут прежде всего из факта, что склейка строк не коммутативная операция в отличие от других. То есть a || b <> b || a в отличие, например, от суммы или среднего. Соответственно listagg позволяет указывать сортировку результата, но не сортировку окна. С другой стороны stragg позволяет сортировать в окне, но сортировку в результирующей строке указать невозможно. Это вполне закономерно, поскольку в UDAG не предусмотрена возможность учитывать некоммутативность операции. Возвращаясь к listagg, не совсем понятно почему не сделали возможность указывать order by (и distinct, но это другая проблема и более легко решаемая). то есть сделать это невозможно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 16:30 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
ora601bhr, "как задать спецификацию окна чтоб в агрегации участвовали первые 10 строк партиции? " Как вариант - пронумеровать сначало row_number() и? ограничить выборку первыми десятью строчками партиции? мне нужны все строчки. и чтоб у двадцатой строки была агрегация первых 10 сточек. я конечно использовал row_number() и использовал listagg group by/ а потом основную таблицу связывал с этой агрегацией. Но хотелось бы через аналитические функции. И еще.... фиг с ней с листагг. неужели нет простого способа задать окно "первые десять строчек"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 16:35 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
bhrora601bhr, "как задать спецификацию окна чтоб в агрегации участвовали первые 10 строк партиции? " Как вариант - пронумеровать сначало row_number() ограничить выборку первыми десятью строчками партиции? sum() over(order by rn range between 1 AND 10) . Простого способа нет) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 16:41 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
bhr, Для твоей задачи просто создай и используй stragg, там можно указывать определения окна по строкам. Если же стоит цель, например аналитическая склейка и результат в обратном порядке (столбец col в примере ниже), то тут никак listagg/stragg не помогут. Решается встроенными функциями через склейку всего + regexp или через PL/SQL Про решения через model и recursive subquery factoring речь не идет ибо баловство. Код: plsql 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. f Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 16:44 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
ora601bhrпропущено... ограничить выборку первыми десятью строчками партиции? sum() over(order by rn range between 1 AND 10) . Простого способа нет) Точнее : Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 16:51 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
ora601, ТС спрашивает про склейку строк, а ты ему про сумму вещаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 16:53 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopora601, ТС спрашивает про склейку строк, а ты ему про сумму вещаешь. Я ему вещаю про первые 10 строк в партиции, если что) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 17:08 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
ora601 Я ему вещаю про первые 10 строк в партиции, если что) И что? LISTAGG не имеет windowing и посему не хавает ROWS/RANGE PRECEDING/FOLLOWING. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 17:16 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
ora601dbms_photoshopora601, ТС спрашивает про склейку строк, а ты ему про сумму вещаешь. Я ему вещаю про первые 10 строк в партиции, если что) Ему вроде как надо склейку, но даже если речь про сумму, то нет смысла указывать то, в чем нет надобности ora601Точнее : Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 17:17 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
SYora601 Я ему вещаю про первые 10 строк в партиции, если что) И что? LISTAGG не имеет windowing и посему не хавает ROWS/RANGE PRECEDING/FOLLOWING. SY. Я говорю за work-around, а не за решение в лоб. Тем более там вопрос не только по listagg, но и по аналитике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 17:18 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
bhr, Код: plsql 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 17:25 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
в теме действительно два вопроса. не хотел создавать две темы. Спасибо за наводку по поводу ограничения первых 10 строк. Listagg - пока не понял. пошел по указанной ссылке (asktom). понял, что создается собственная аналитическая ф-я. Я никогда своих аналитических функций не создавал. Посоветуйте, что почитать (желательно ссылку). Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 17:48 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
bhr, Тебе так сложно взять непонятное слово и вбить в гугл? Например, "ODCIAggregateInitialize oracle magazine" добавив oracle magazine чтоб было понятно "для самых маленьких" без лишних технических деталей. Первой ссылкой ты увидишь Build Custom Aggregate Functions ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 18:15 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopbhr, Код: plsql 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. 6. 7. спасибо. listagg(case when srt <= 3 then a.txt end, ' ,') within group (order by a.srt) over (partition by id) first_3 именно то что нужно!!! этого и пытался добиться. regexp_replace(lstagg || ' ', '^([^ ]+ ){' || to_char(srt - 1) || '}(([^ ]+ ){1,3})(.*)', '\2') moving_3 не то задача возникла изза ошибки оракла при попытке применить listagg к партиции размером в 5000 строк. нужно было ввести ограничение. причем сцепить и потом отрезать не получится, ибо оракл выдает ошибку в момент сцепки. а case внутри listagg - очень красиво. Чето я ступил в свое время. Не додумкал. спасибо еще раз. возьму на вооружение. Просто и изящно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 18:23 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopbhr, Тебе так сложно взять непонятное слово и вбить в гугл? Например, "ODCIAggregateInitialize oracle magazine" добавив oracle magazine чтоб было понятно "для самых маленьких" без лишних технических деталей. Первой ссылкой ты увидишь Build Custom Aggregate Functions а как я мог догадаться, что сии названия функций - предопределенные, а не придуманные сиюминутно автором статьи? За наводку - спасибо. Готов согласиться, что я дурак, лишь бы получить нужные знания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 18:35 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
Рекурсивный CTE: Код: 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. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 18:56 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
А если LISTAGGируемые значения уникальны и ename не содержит спецсимволов regexp: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 19:24 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
SY, А вы читаете сообщения в топике, кроме своих? Я уже вроде как сообщил что CTE - баловство и привел решения с regexp и PL/SQL. С объяснением сопутствующих деталей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 19:42 |
|
||
|
спецификация окна в listagg
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopЯ уже вроде как сообщил что CTE - баловство И что? Я же не привел STRAGG еще раз. В допoлнение я привел CTE. Кроме того довольно затратно сортировать в ODCIAggregateMerge. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 20:37 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39340983&tid=1887086]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
195ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
78ms |
get tp. blocked users: |
2ms |
| others: | 252ms |
| total: | 578ms |

| 0 / 0 |
