Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3      [все]
 List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
Когда уже на Oracle будет нормальная аггрегатная функция List , как в Sybase
16 май 19, 23:39    [21886703]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1422
Victor Cookin,

"Доку не читай, сразу на форум пости"(с)

Давно уже есть такая функция.
17 май 19, 05:54    [21886764]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1422
Victor Cookin,

либо указывайте конкретно - чем LIST в сайбесе лучше ораклового LISTAGGA-а и чего лично вам не хватает в LISTAGG-е
17 май 19, 05:55    [21886765]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29197
Victor Cookin
Когда уже на Oracle будет нормальная аггрегатная функция List , как в Sybase
Шёл бы ты, бездарь, на откуда пришёл.
17 май 19, 07:35    [21886791]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
AmKad
Member

Откуда:
Сообщений: 5049
Справедливости ради стоит отметить, что приведенная топикстартером функция вражеской датабазы возвращает LONG VARCHAR, что несколько превышает максимальный размер возращаемого listagg ораколового varchar2.
Но, как все мы знаем, вышесказанное мною не отменяет возможности получить список элементов в строковом виде условно неограниченного размера средствами Oracle без PL/SQL и listagg.
17 май 19, 08:44    [21886815]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
Щукина Анна
и чего лично вам не хватает в LISTAGG-е


unique


ps
в новых версиях з WITHIN улучшили

если есть сортировка, то добавить уникальность не так уж и сложно
.....
stax
17 май 19, 08:56    [21886833]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
AserYZ
Member

Откуда: Dniepr (Ukraine)
Сообщений: 226
AmKad
Справедливости ради стоит отметить, что приведенная топикстартером функция вражеской датабазы возвращает LONG VARCHAR, что несколько превышает максимальный размер возращаемого listagg ораколового varchar2.
Но, как все мы знаем, вышесказанное мною не отменяет возможности получить список элементов в строковом виде условно неограниченного размера средствами Oracle без PL/SQL и listagg.


В соседней сходной ветке уже выяснили, что после 12 версии Ваш аргумент не аргумент и Оракл удлинил свой варчар2 до 32к что вполне хватает для разного вида рукожопства членов кружка CLOBофобии. Это конечно не 512 терабайт, но то ли ещё будет.
17 май 19, 09:34    [21886874]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
-2-
Member

Откуда:
Сообщений: 14850
AserYZ
Ваш аргумент не аргумент и Оракл удлинил свой варчар2 до 32к что вполне хватает для разного вида рукожопства членов кружка CLOBофобии.
Замена фобии на более другую фобию не есть аргумент против аргумента.
17 май 19, 09:49    [21886892]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
AmKad
Member

Откуда:
Сообщений: 5049
AserYZ,

Отбросив вопрос о целесообразности склеивания строк в сторону, 32к - это больше, чем 4к, всего в 8 раз. До 512 терабайт еще сколько-то порядков, что не делает listagg аналогом функции list. О чем я, силу своей дотошности, не смог не заметить.
17 май 19, 09:57    [21886906]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
-2-
Member

Откуда:
Сообщений: 14850
Stax
Щукина Анна
и чего лично вам не хватает в LISTAGG-е
unique
unique формально нет в синтаксисе
LISTAGG( [ ALL ] [ DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
[ WITHIN GROUP ] (order_by_clause) [OVER query_partition_clause]
но оно работает:
select listagg(unique to_char(mod(level, 3)), ',') within group (order by null) v193
from dual
connect by level<=10;

V193   
-----
0,1,2

AmKad
О чем я, силу своей дотошности, не смог не заметить.
Тогда нужно было дотошнить до более полного сравнения:
- типы аргумента,
- размер результата,
- ограничения по сортировке,
- параметры overflow,
- over().
17 май 19, 10:25    [21886942]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
AmKad
Member

Откуда:
Сообщений: 5049
-2-
Тогда нужно было дотошнить до более полного сравнения:
Я сегодня скудно позавтракал, поэтому содержимого желудка хватило только на сравнение размеров результата. А про overflow вообще только что узнал.
17 май 19, 10:32    [21886954]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
-2-
Stax
пропущено...
unique
unique формально нет в синтаксисе
LISTAGG( [ ALL ] [ DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
[ WITHIN GROUP ] (order_by_clause) [OVER query_partition_clause]
но оно работает:
select listagg(unique to_char(mod(level, 3)), ',') within group (order by null) v193
from dual
connect by level<=10;

V193   
-----
0,1,2



мододцы (доку не успели поправить)


в Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.3.0.0.0
еще не работает
select listagg(unique job, ',') within group (order by null)
from emp 
group by deptnoORA-30482: DISTINCT option not allowed for this function

ORA-30482: DISTINCT option not allowed for this function


ps
по диаграме сортировка обязательна но без нее работает
select listagg(job, ',') --within group (order by null)
from emp 
group by deptno

MANAGER,SALESMAN,SALESMAN,SALESMAN,SALESMAN,CLERK
PRESIDENT,MANAGER,CLERK
MANAGER,ANALYST,ANALYST,CLERK,CLERK


....
stax
17 май 19, 11:21    [21887033]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
AmKad
А про overflow вообще только что узнал.


добавіть, добавили
но реализовали неакуратно (мой админ бы не принял)

....
stax
17 май 19, 11:25    [21887040]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
mayton
Member

Откуда: loopback
Сообщений: 41895
Он хотел как в Лиспе.

(list x y z)
17 май 19, 17:29    [21887515]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
Хочется вот этого:
select LIST(column_name)
from all_tab_columns
where table_name = 'ESTABLISHMENT'
order by column_id


вместо

select LISTAGG(column_name, ',') within group (order by column_id)
from all_tab_columns
where table_name = 'ESTABLISHMENT'


 within group 
убирать пробовал, но "ORA-02000: missing WITHIN keyword"
Oracle 12
17 май 19, 20:11    [21887607]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17580
Victor Cookin
Хочется

Это от непонимания.
Включите в Ваш пример group by и попробуйте переосмыслить.
17 май 19, 20:23    [21887614]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
-2-
Member

Откуда:
Сообщений: 14850
Victor Cookin
Хочется вот этого:
select LIST(column_name)
from all_tab_columns
where table_name = 'ESTABLISHMENT'
order by column_id

И что в sybase выдаст этот запрос?
17 май 19, 20:45    [21887623]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52330
в мсскл назвали string_agg
Все что-то своё выдумавыют
19 май 19, 11:34    [21888101]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9563
andreymx
в мсскл назвали string_agg
Все что-то своё выдумавыют


Суть не в названии а в том что это функция агрегатная. Т.e. сначала агрегация (GROUP BY по умолчанию) и только потом ORDER BY. Посему ORDER BY в примере от Victor Cookin произведет сортировку одной строки т.к. неявная группировкa а при явной нибо вылетит с "not a GROUP BY expression" либо отсортирует уже сгруппированные строки (если поле в ORDER BY присутствует в GROUP BY). Но в любом случае этот ORDER BY не имеет ничего общего c ORDER BY при группировке указываемый в WITHIN GROUP. Другое дело ORACLE мог бы сделать кляузу WITHIN GROUP(ORDER BY 1) кляузой по умолчанию - куда меньше буковок если порядок не важен.

SY
19 май 19, 14:31    [21888183]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
-2-
Member

Откуда:
Сообщений: 14850
SY
ORACLE мог бы сделать кляузу WITHIN GROUP(ORDER BY 1) кляузой по умолчанию - куда меньше буковок если порядок не важен.
1 или не 1, но что-то по-умолчанию есть
select listagg(dummy) v193
from dual
connect by level<=5
group by mod(level, 2);

V193
----
XXX
XX
19 май 19, 17:46    [21888289]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9563
-2-
1 или не 1, но что-то по-умолчанию есть


Ну значит внял Oracle просьбам трудящихся:

SQL> select  version
  2    from  v$instance
  3  /

VERSION
-----------------
12.2.0.1.0

SQL> select listagg(dummy) v193
  2  from dual
  3  connect by level<=5
  4  group by mod(level, 2);
select listagg(dummy) v193
                      *
ERROR at line 1:
ORA-02000: missing WITHIN keyword


SQL>


SY.
19 май 19, 18:02    [21888303]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
SY

Ну значит внял Oracle просьбам трудящихся:

SY.


в 18-ке кляуза WITHIN GROUP еще обязательна, но без нее ошибки уже не выдает
https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/LISTAGG.html#GUID-B6E50D8E-F467-425B-9436-F7F8BF38D466

.....
stax
20 май 19, 08:27    [21888527]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
andrey_anonymous
Это от непонимания.
Включите в Ваш пример group by и попробуйте переосмыслить.

Во многих случаях нужно просто взять результат запроса и получить именно лист, т.е. одно значение. При этом сам запрос может быть, понятно, довольно сложным. И визуально усложнять его при ненадобности этого делать - это нехорошо.

Stax
в 18-ке кляуза WITHIN GROUP еще обязательна, но без нее ошибки уже не выдает

а где уже не обязательна?
20 май 19, 17:09    [21889048]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17580
Victor Cookin
andrey_anonymous
Это от непонимания.
Включите в Ваш пример group by и попробуйте переосмыслить.

Во многих случаях нужно просто взять результат запроса и получить именно лист, т.е. одно значение. При этом сам запрос может быть, понятно, довольно сложным. И визуально усложнять его при ненадобности этого делать - это нехорошо.

Нехорошо путать теплое с мягким, а именно - сортировку итоговой выборки и сортировку внутри группы, итогом которой станет одна строка итоговой выборки.
20 май 19, 17:27    [21889066]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
andrey_anonymous
Нехорошо путать теплое с мягким, а именно - сортировку итоговой выборки и сортировку внутри группы, итогом которой станет одна строка итоговой выборки.


Пожалуйста поподробнее. Где в моём примере группа и сортировка внутри группы? У меня есть сортировка исходного запроса и всё, а больше мне (в данном случае) ничего не надо. И зачем требует group by column_id , когда надо order by column_id?
20 май 19, 17:50    [21889088]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
-2-
Member

Откуда:
Сообщений: 14850
Victor Cookin
И зачем требует group by column_id , когда надо order by column_id?
Потому что формальный язык не должен додумывать за тебя, ошибся ли ты в сортировке или группировке.
20 май 19, 18:41    [21889126]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9563
Victor Cookin
Пожалуйста поподробнее. Где в моём примере группа и сортировка внутри группы? У меня есть сортировка исходного запроса и всё, а больше мне (в данном случае) ничего не надо. И зачем требует group by column_id , когда надо order by column_id?


Группировка бывает явная при указании GROUP BY или неявная при использовании агрегатных функций. В SYBASE LIST это:

LIST function [Aggregate].

Посему:

select LIST(column_name)
from all_tab_columns
where table_name = 'ESTABLISHMENT'
order by column_id


вначале сгруппирует все строки в одну группу и сконкатенирует все имена полей таблицы ESTABLISHMENT в произвольном порядке. В результате получим ровно одну строку. Да, формально мы можем добавить order by column_id но согласись сортировка одной строки занятие ну ооочень занимательное . И никто не говорил тебе нужно group by column_id. Тебе нужно order by column_id при конкатенации имен полей. А это указывается в самой LIST, а не в ORDER BY запроса:

IST function [Aggregate]
Returns a delimited list of values for every row in a group.

Syntax
LIST(
[ALL | DISTINCT] string-expresssion
[, 'delimiter-string']
[ORDER BY order-by-expression [ ASC | DESC ], ... ] )


Т.e. твоя хотлка выглядит так:

select LIST(column_name order by column_id)
from all_tab_columns
where table_name = 'ESTABLISHMENT'


SY.
20 май 19, 18:55    [21889137]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
SY
Да, формально мы можем добавить order by column_id но согласись сортировка одной строки занятие ну ооочень занимательное .

Никакой сортировки внутри строки нет. Идёт просто конкатенация поля из запроса.
SY
И никто не говорил тебе нужно group by column_id.

а вот:
within group (order by column_id)

SY
Тебе нужно order by column_id при конкатенации имен полей. А это указывается в самой LIST, а не в ORDER BY запроса

Да не хочу я строку сортировать. Строку кроме как по алфавиту и не от сортируешь. Мне достаточно сортировки в запросе
20 май 19, 20:27    [21889203]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17580
Victor Cookin
не хочу я строку сортировать. Строку кроме как по алфавиту и не от сортируешь. Мне достаточно сортировки в запросе

Иногда лучше жевать, чем говорить (с)
20 май 19, 20:49    [21889218]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
-2-
Потому что формальный язык не должен додумывать за тебя, ошибся ли ты в сортировке или группировке.

А у меня вообще нет группировки, вернее, группировка ВСЕ. Мне кажется она должна быть по умолчанию. Ведь есть же она в некоторых других аггрегатных функциях, например AVG:

select avg (column_id) 
from all_tab_columns
where table_name = 'ESTABLISHMENT'


Можно, кончно, добавить что-то типа
group by 1

а потом долго думать что это было и почему работает
20 май 19, 23:15    [21889269]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
xtender
Member

Откуда: Мск
Сообщений: 5216
Victor Cookin,

Про детерминизм результата группировки не думал? А avg, sum, count и тд он есть.
20 май 19, 23:50    [21889281]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9563
Victor Cookin
Да не хочу я строку сортировать. Строку кроме как по алфавиту и не от сортируешь. Мне достаточно сортировки в запросе


Пoследняя попытка. ORDER BY выполняется последним и сортирует результат всех предыдущих шагов. Т.e. шаг пeрвый это выборка всех строк где table_name = 'ESTABLISHMENT'. Шаг второй это конкатенация значений поля column_name всех выбранных строк. Т.е. результат второго шага это одна строка. Вот к ней и будет применен шаг трeтий - ORDER BY который и произведет бессмысленную сортировку. Так-что ORDER BY в твоем SELECTе - не пришей кобыле хвост. Результат что с ним, что без него это конкатенация значений имен полей таблицы ESTABLISHMENT в произвольном порядке.

Victor Cookin
Строку кроме как по алфавиту и не от сортируешь.


И тут ты не догоняешь. ORDER BY внутри LIST cортирует ROWS в группе. И в отличие от statement level этот ORDER BY выполнится как часть второго шага. Например:

LIST(column_name order by column_id)


сконкатенирует имена полей таблицы ESTABLISHMENT в том порядке в котором они заданы в таблице. А

LIST(column_name order by data_type)


сконкатенирует имена полей таблицы ESTABLISHMENT в порядке их типа данных.

SY.
21 май 19, 00:12    [21889289]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
-2-
Member

Откуда:
Сообщений: 14850
xtender
Про детерминизм результата группировки не думал? А avg, sum, count и тд он есть.
За avg и sum я бы не вписывался. Результат может зависеть от порядка суммирования. С count distinct тоже есть нюансы.
21 май 19, 07:07    [21889351]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
Victor Cookin
а где уже не обязательна?

в Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.3.0.0.0
ошибки не выдает
21887033

формально такое поведение можно считать и багом
select listagg(job, ',')  l
from emp 
group by deptno

MANAGER,SALESMAN,SALESMAN,SALESMAN,SALESMAN,CLERK
PRESIDENT,MANAGER,CLERK
MANAGER,ANALYST,ANALYST,CLERK,CLERK


....
stax
21 май 19, 09:08    [21889399]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
AmKad
Member

Откуда:
Сообщений: 5049
-2-
xtender
Про детерминизм результата группировки не думал? А avg, sum, count и тд он есть.
За avg и sum я бы не вписывался. Результат может зависеть от порядка суммирования.
Как так?
-2-
С count distinct тоже есть нюансы.
А это как?
21 май 19, 12:31    [21889623]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29197
AmKad
-2-
За avg и sum я бы не вписывался. Результат может зависеть от порядка суммирования.
Как так?
+ Потеря точности
SQL> with a as (select 2/3 as x from dual connect by level <= 10000)
  2     , b as (select 1/3 as x from dual connect by level <= 10000)
  3  select to_char(sum(x))
  4    from (select * from a union all select * from b)
  5  ;

TO_CHAR(SUM(X))
----------------------------------------
9999.99999999999999999999999999999999995

1 row selected.

SQL> with a as (select 2/3 as x from dual connect by level <= 10000)
  2     , b as (select 1/3 as x from dual connect by level <= 10000)
  3  select to_char(sum(x))
  4    from (select * from b union all select * from a)
  5  ;

TO_CHAR(SUM(X))
----------------------------------------
10000.0000000000000000000000000000000001

1 row selected.
21 май 19, 12:58    [21889650]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52330
Многие тут говорят про сортировку одной строки и забывают про 00979
21 май 19, 13:18    [21889674]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17580
Elic
AmKad
пропущено...
Как так?
Потеря точности

А с сортировками есть ньюанс в виде ограничения на длину ключа сортировки.
21 май 19, 13:18    [21889675]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
andrey_anonymous
Elic
пропущено...
Потеря точности

А с сортировками есть ньюанс в виде ограничения на длину ключа сортировки.


в доке ньюанс не описали (видать считают что и так понятно)

The order_by_clause determines the order in which the concatenated values are returned. The function is deterministic only if the ORDER BY column list achieved unique ordering.

....
stax
21 май 19, 13:48    [21889709]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29197
Stax
в доке ньюанс не описали (видать считают что и так понятно)

The order_by_clause determines the order in which the concatenated
Ты уже выпал из темы.
21 май 19, 13:50    [21889712]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
-2-
Member

Откуда:
Сообщений: 14850
AmKad
-2-
С count distinct тоже есть нюансы.
А это как?
with t(s, x) as (select 'ab',2 from dual union all select 'bc',1 from dual union all select 'cd',3 from dual)
select 'S' sx, count(distinct testdistinct(s)) cd from (select s from t order by s)
union all
select 'X' sx, count(distinct testdistinct(s)) cd from (select s from t order by x);

S         CD
- ----------
S          2
X          1
21 май 19, 13:56    [21889722]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
Elic
Ты уже выпал из темы.

да я не очень то и впадал в тему

просто интересно
1) как поведет себя сортировка в случае MAX_STRING_SIZE = EXTENDED
2) почему "неоптимально" (с запасом) реализовали ON OVERFLOW TRUNCATE

ps
мне ето не надо, просто по старинке интересно

.....
stax
21 май 19, 14:00    [21889734]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9563
andreymx
Многие тут говорят про сортировку одной строки и забывают про 00979


Перечитай мой отвeт тебе-же:

SY
Посему ORDER BY в примере от Victor Cookin произведет сортировку одной строки т.к. неявная группировкa а при явной нибо вылетит с "not a GROUP BY expression" либо отсортирует уже сгруппированные строки (если поле в ORDER BY присутствует в GROUP BY).


SY.
21 май 19, 14:59    [21889794]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
AmKad
Member

Откуда:
Сообщений: 5049
-2-
testdistinct
А что у этого зверя под капотом? Сохранение параметров с последующим их сравнением?
21 май 19, 16:22    [21889873]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
-2-
Member

Откуда:
Сообщений: 14850
AmKad
-2-
testdistinct
А что у этого зверя под капотом? Сохранение параметров с последующим их сравнением?
Состояния нет. Сравнение значений детерминировано = строки имеют общий символ:
ab = bc
bc = cd
21 май 19, 17:53    [21889970]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
SY
Пoследняя попытка. ORDER BY выполняется последним и сортирует результат всех предыдущих шагов.


а я не хочу никаких сортировок последним шагом, последним шагом я хочу ТОЛЬКО выполнение аггрегатной функции. По-моему, это логично. Так делается НЕ в Оракле и, по-моему, такой вариант - именно то, что часто и нужно. А Вы всё о том, как это делается в Оракле. Да зарадибога

SY
Результат что с ним, что без него это конкатенация значений имен полей таблицы ESTABLISHMENT в произвольном порядке.

Ну да, а в Sybase не в произвольном.

SY
Victor Cookin
Строку кроме как по алфавиту и не от сортируешь.
И тут ты не догоняешь. ORDER BY внутри LIST cортирует ROWS в группе. И в отличие от statement level этот ORDER BY выполнится как часть второго шага

Ну вот. Есть строка (и больше ничего - перечитайте мой текст). Какие ещё ROWS?

Point: Почему не сделать аггрегатные функции именно аггрегатными - то есть не трогать Recodset под ним?
21 май 19, 22:44    [21890100]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17580
Victor Cookin
Point

Вот интересно, Victor Cookin - это толстый тролль или реальный неадекват?
22 май 19, 01:30    [21890159]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
-2-
Member

Откуда:
Сообщений: 14850
Victor Cookin
Почему не сделать аггрегатные функции именно аггрегатными - то есть не трогать Recodset под ним?
Какие функции обязывают "трогать"? Знаю first/last, cume_dist, percentile_ и всякие _rank. В чем их смысл, как не в сортировке?
22 май 19, 06:59    [21890190]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29197
andrey_anonymous
Вот интересно, Victor Cookin - это толстый тролль или реальный неадекват?
Однохренственно. Тратить именно на него время - бессмысленно.
22 май 19, 07:47    [21890210]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
-2-
AmKad
пропущено...
А что у этого зверя под капотом? Сохранение параметров с последующим их сравнением?
Состояния нет. Сравнение значений детерминировано = строки имеют общий символ:
ab = bc
bc = cd

предыдущее значение разве ето не состояние?

.....
stax
22 май 19, 08:19    [21890230]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
Victor Cookin
а я не хочу никаких сортировок последним шагом, последним шагом я хочу ТОЛЬКО выполнение аггрегатной функции. По-моему, это логично. Так делается НЕ в Оракле и, по-моему, такой вариант - именно то, что часто и нужно. А Вы всё о том, как это делается в Оракле. Да зарадибога

Point: Почему не сделать аггрегатные функции именно аггрегатными - то есть не трогать Recodset под ним?


как выглядит решение в sybase такой задачки?

для каждого отдела сформировать через запятую список (list) сотрудников (первый с самой большой ЗП, если равные то и по ТН), результат отсортировать по номерах отделов по убыванию.

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7782 CLARK      MANAGER         7839 09.06.81       2450                    10
      7839 KING       PRESIDENT            17.11.81       5000                    10
      7934 MILLER     CLERK           7782 23.01.82       1300                    10
      7566 JONES      MANAGER         7839 02.04.81       2975                    20
      7902 FORD       ANALYST         7566 03.12.81       3000                    20
      7876 ADAMS      CLERK           7788 12.01.83       1100                    20
      7369 SMITH      CLERK           7902 17.12.80        800                    20
      7788 SCOTT      ANALYST         7566 09.12.82       3000                    20
      7521 WARD       SALESMAN        7698 22.02.81       1250        500         30
      7844 TURNER     SALESMAN        7698 08.09.81       1500                    30
      7499 ALLEN      SALESMAN        7698 20.02.81       1600        300         30
      7900 JAMES      CLERK           7698 03.12.81        950                    30
      7698 BLAKE      MANAGER         7839 01.05.81       2850                    30
      7654 MARTIN     SALESMAN        7698 28.09.81       1250       1400         30

результат

    DEPTNO F
---------- --------------------------------------------------
        30 BLAKE,MARTIN,ALLEN,WARD,TURNER,JAMES
        20 SCOTT,FORD,JONES,ADAMS,SMITH
        10 KING,CLARK,MILLER


Point: аггрегатные функции именно аггрегатные - если не нужно то они не трогают Recodset под ним
напр sum

....
stax
22 май 19, 08:40    [21890247]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
Stax,

Именно такой таблицы у меня нет, но есть аналогичная loc_user, где сотрудники (loc_u_code) привязаны к различным офисам(loc_u_loc) и у них есть некий уровень доступа (loc_u_level) (аналог З/П)

Вот запрос:
select loc_u_loc, list (loc_u_code order by loc_u_level desc, loc_u_code) a
from loc_user
group by loc_u_loc
order by loc_u_loc desc


Необходимо добавить, что в 99 процентах случаев мне достаточно запросов, который я сформулировал в начале топика.
И для данного запроса предпочёл бы, чтобы синтаксис был бы

select loc_u_loc, list (loc_u_code) a
from loc_user
group by loc_u_loc
order by loc_u_loc desc, loc_u_level desc, loc_u_code


Я понимаю формальную некорректность такого синтаксиса, но ведь он легко и однозначно трансформируется в

select loc_u_loc, list (a) from (
select loc_u_loc, loc_u_level, list (loc_u_code) a
from loc_user
group by loc_u_loc, loc_u_level
order by loc_u_loc desc, loc_u_level desc) z
group by loc_u_loc
order by loc_u_loc desc


который прекрасно работает

результат

Row loc_u_loc list(z.a)
1 7011 AA006,AA030,AD041,AG063,AK022,...
2 7005 AA006,AA030,AD035,AD041,AG063,AK022,...
3 7003 AA006,AA030,AD035,AD041,AG063,AK022,...
22 май 19, 17:41    [21891068]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
Victor Cookin
Stax,

Именно такой таблицы у меня нет, но есть аналогичная loc_user, где сотрудники (loc_u_code) привязаны к различным офисам(loc_u_loc) и у них есть некий уровень доступа (loc_u_level) (аналог З/П)

Вот запрос:
select loc_u_loc, list (loc_u_code order by loc_u_level desc, loc_u_code) a
from loc_user
group by loc_u_loc
order by loc_u_loc desc



в оракле так же
чутку начудили с синтаксисом
вынесли за скобки order by с within group (order by column_id)

SQL> select deptno
  2  ,listagg(ename,',') WITHIN GROUP (ORDER BY sal+nvl(comm,0) desc,empno) f
  3  from emp e
  4  group by deptno
  5  order by deptno desc
  6  /

    DEPTNO F
---------- --------------------------------------------------
        30 BLAKE,MARTIN,ALLEN,WARD,TURNER,JAMES
        20 SCOTT,FORD,JONES,ADAMS,SMITH
        10 KING,CLARK,MILLER


Victor Cookin
Я понимаю формальную некорректность такого синтаксиса, но ведь он легко и однозначно трансформируется в

select loc_u_loc, list (a) from (
select loc_u_loc, loc_u_level, list (loc_u_code) a
from loc_user
group by loc_u_loc, loc_u_level
order by loc_u_loc desc, loc_u_level desc) z
group by loc_u_loc
order by loc_u_loc desc


который прекрасно работает


странно
для group by loc_u_loc, loc_u_level
list должен сформироватся в разрезе не только офиса но и доступа

....
stax
22 май 19, 17:57    [21891088]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17580
Victor Cookin
Я понимаю формальную некорректность такого синтаксиса

Раз понимаете - воспользуйтесь корректным:
select loc_u_loc
     , listagg(loc_u_code, ',') within group (order by loc_u_level desc) l
  from loc_user
 group by loc_u_loc
 order by loc_u_loc desc
22 май 19, 18:00    [21891090]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29197
Victor Cookin
Я понимаю формальную некорректность такого синтаксиса, но ведь он легко и однозначно трансформируется в
Подай патент, рационализатор, самому ораклу и заработай кучу бабла.
Но однозначно видна только твоя узколобость.
22 май 19, 18:02    [21891094]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
andrey_anonymous
Раз понимаете - воспользуйтесь корректным


А сортировка по loc_u_code - по умолчанию, как в Sybase?
22 май 19, 18:11    [21891102]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17580
Victor Cookin
andrey_anonymous
Раз понимаете - воспользуйтесь корректным

А сортировка по loc_u_code

как закажете, так и будет:
within group (order by loc_u_level desc, loc_u_code)
22 май 19, 18:14    [21891103]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
Victor Cookin
andrey_anonymous
Раз понимаете - воспользуйтесь корректным


А сортировка по loc_u_code - по умолчанию, как в Sybase?


в оракле (если брать по диаграме) кляуза сортировки обязательно, что неудобно
если сортировать не надо, то указывали фикцию напр WITHIN GROUP (ORDER BY null)

в 18-й версии без WITHIN GROUP ошибки не выдает

ps
так как нет clob-а, добавили кляузу ON OVERFLOW (как на меня не учень удачно)

....
stax
22 май 19, 18:19    [21891109]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
Elic
Но однозначно видна только твоя узколобость.

Чего злой такой?
22 май 19, 19:12    [21891150]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52330
Victor Cookin
Elic
Но однозначно видна только твоя узколобость.

Чего злой такой?
не обращай внимания
Он такой и есть, много знает, но злой
22 май 19, 19:17    [21891161]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29197
Victor Cookin
Чего злой такой?
Сперва встречный вопрос: откуда такая упрямая тупость? Делов-то - играть по правилам, а не плакаться в монастыре со своим уставом.
23 май 19, 07:59    [21891429]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6710
andreymx
Он такой и есть, много знает, но злой

потому и злой, что много знает, был бы глупый - был бы добрый
23 май 19, 10:47    [21891609]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
Elic
Сперва встречный вопрос

Ты еврей? Тогда поверю, что много знаешь.
Elic
откуда такая упрямая тупость?

Не физдии и не физдим будешь
Elic
Делов-то - играть по правилам

Эхма, как тебя жизня закондыбасила
Elic
Д а не плакаться в монастыре со своим уставом.

Устав я от твоих устав
23 май 19, 20:43    [21892493]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
alex-ls
потому и злой, что много знает, был бы глупый - был бы добрый

многознатство и ум - малопересекающиеся сущности
23 май 19, 20:44    [21892494]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52330
Предлагаю прекратить выяснения отношений, о чём также попросил модераторов, всем удачи
23 май 19, 23:18    [21892559]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29197
andreymx
о чём также попросил модераторов
Их вина лишь в том, что не отстрелили долб@$ба на взлёте.
24 май 19, 07:49    [21892639]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
и хоть бы кто про xmlagg сказал...
4 июн 19, 00:59    [21901044]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
Victor Cookin
и хоть бы кто про xmlagg сказал...


на первой странице 21886815

....
stax
4 июн 19, 08:35    [21901142]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
Stax

на первой странице 21886815

stax


Я не специалист по Ораклу, мне потребовалось время, чтобы докопаться.
А то "string too long"...

Хотя синтаксис ещё круче
select region_id, count(*) nn,         xmlagg(xmlelement(e,STORE_ID,',')
               order by STORE_ID).extract('//text()') ests
               from STORE group by region_id


но хоть работает
4 июн 19, 17:10    [21901725]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9563
Victor Cookin
но хоть работает


xmlagg(xmlelement(e,STORE_ID,',') order by STORE_ID).extract('//text()') ests


вернет XMLTYPE а не строку да еще с лишней зпт справа. Используй XMLCAST а не EXTRACT и поменяй местами STORE_ID и зпт - лeгче отсечь лишнюю зпт:

substr(xmlcast(xmlagg(xmlelement(e,',',STORE_ID) order by STORE_ID) as clob),2) ests


SY.
4 июн 19, 20:49    [21901923]     Ответить | Цитировать Сообщить модератору
 Re: List?  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
SY, спасибо.

Но!

В моём случае TOAD покажет строку и прекрасно её экспортирует, в вашем - покажет (HUGECLOB) и не экспортирует /по умолчанию не экспортирует, надо в настройки лезть/. По времени выполнения - одинаково.
4 июн 19, 21:35    [21901956]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / Oracle Ответить