powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
20 сообщений из 20, страница 1 из 1
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38572141
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Дано:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with
c1 as(
  select 1 i, 2 k from rdb$database union all
  select 1 i, 2 k from rdb$database union all
  select 2 i, 3 k from rdb$database union all
  select 2 i, 3 k from rdb$database union all
  select 5 i, 5 k from rdb$database
)
,c2 as(
  select i, k
  from c1
)
select i, k, min(k)over() k2
from c2
group by i,k

Result:IKK2122232552

Теперь предположим, что мне НЕ нужен в итоговой выборке столб " K ", и при этом:
1) группировка должна быть сохранена по тем же полям (i,k)
2) результат min()over() должен быть обозван именем исключенного сейчас столбца, т.е. так же: " K ".

Запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with
c1 as(
  select 1 i, 2 k from rdb$database union all
  select 1 i, 2 k from rdb$database union all
  select 2 i, 3 k from rdb$database union all
  select 2 i, 3 k from rdb$database union all
  select 5 i, 5 k from rdb$database
)
,c2 as(
  select i, k
  from c1
)
select i, min(k)over() k
from c2
group by i, k

- выдаст: "Cannot use an aggregate function in a GROUP BY clause."

Его аналог в M$ SQL:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with
c1 as(
  select 1 i, 2 k union all
  select 1 i, 2 k union all
  select 2 i, 3 k union all
  select 2 i, 3 k union all
  select 5 i, 5 k 
)
,c2 as(
  select i, k, 0 n
  from c1
)
select i, min(k)over() k
from c2
group by i, k

и в Oracle:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SH@ao61 18:20:06>with
  2  c1 as(
  3    select 1 i, 2 k from dual union all
  4    select 1 i, 2 k from dual union all
  5    select 2 i, 3 k from dual union all
  6    select 2 i, 3 k from dual union all
  7    select 5 i, 5 k from dual
  8  )
  9  ,c2 as(
 10    select i, k
 11    from c1
 12  )
 13  select i, min(k)over() k
 14  from c2
 15  group by i, k;

- выводят результат без ругани:
Код: plaintext
1.
2.
3.
4.
  I          K
--- ----------
  5          2
  2          2
  1          2

Кто не прав, мы или они ? (я не уверен ни в том ни в другом варианте ответа, потому и спрашиваю).

PS. Оконная функция на самом деле ни при чём, вот так тоже выругается, и именно из-за "нехорошего алиаса" столбца:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with
c1 as(
  select 1 i, 2 k from rdb$database union all
  select 1 i, 2 k from rdb$database union all
  select 2 i, 3 k from rdb$database union all
  select 2 i, 3 k from rdb$database union all
  select 5 i, 5 k from rdb$database
)
,c2 as(
  select i, k
  from c1
)
select i, min(k) k
from c2
group by i,k



PPSВопрос, наверное, относится к соблюдению стандарта SQL, но спросить решил тут: в "Срачнении СУБД" ответы будут малоадекватными, КМК...
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38572154
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты пытаешься сделать фактически вот это:
group by 1,2
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38572157
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидОконная функция на самом деле ни при чём, вот так тоже выругается, и именно из-за "нехорошего алиаса" столбца

Этот вариант точно не по стандарту. А вот с оконными функциями КМК ничего противозаконного быть не должно.
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38572164
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryТы пытаешься сделать фактически вот это:
group by 1,2да. И что ?
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38572168
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

А выдачу какого сообщения об ошибке ты ожидаешь?
Или ты вообще не считаешь, что тут ошибка?
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38572185
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryА выдачу какого сообщения об ошибке ты ожидаешь?
Или ты вообще не считаешь, что тут ошибка?я *НЕ* уверен, что ФБ делает правильно, вещая об ошибке. Ибо поменяв алиас столбца на что-то другое, например, на 'N', сообщения уже не будет. Алиас столбца никак не должен учитываться в group by, он используется ПОСЛЕ этой операции, когда данные уже идут "дальше", на след. итерацию запроса (т.е. на конечный select или на очередную CTE И проч)
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38572217
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

сортировка/группировка по алиасу - нестандартная фича ФБ, в данном случае она мешает тебе, но от этого не перестает быть фичей
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38572331
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrсортировка/группировка по алиасу - нестандартная фича ФБ, в данном случае она мешает тебе, но от этого не перестает быть фичейЭту "нестандартную фичу " лучше бы назвать просто: несоответствие стандарту.
Объяснение на тему, что должно входить в group by, я нашёл только в тексте стандарта-99 (в 2003 и 2006 разобрать нереально) - см. скрин в аттаче.

Кроме того, в книге "Joe Celko. SQL for Smarties. Advanced SQL Programming. 3rd.Edition" (ISBN 0123693799) на странице 319 русским по белому сказано: Celko, 319Standard SQL does not allow you to use the name of a calculated column such as "(salary + commission) AS total_pay" in the GROUP BY clause, because that column is computed and named in the SELECT clause of this query. It does not exist yet.
However, you will find products that allow it because they create a result table first, using names in the SELECT clause, then fill the result table with rows created by the query.
Из FB-доки следует, что эта "фича" была введена в 2.0 (" In addition to column names, Firebird 2 allows column aliases, column positions and arbitrary valid expressions as GROUP BY items. ").
Может, есть смысл добавить там, что сиё есть отклонение от стандарта ?
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38572401
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЭту "нестандартную фичу " лучше бы назвать просто: несоответствие стандарту.
это наше сознательное дополнение к стандарту, сделанное специально по просьбам трудящихся. Но ты можешь называть как хочешь, разрешаю.
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38572403
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrТаблоидЭту "нестандартную фичу " лучше бы назвать просто: несоответствие стандарту.
это наше сознательное дополнение к стандарту, сделанное специально по просьбам трудящихся. Но ты можешь называть как хочешь, разрешаю.я в итоге этого изврата этой "просьбы трудящихся" не могу сверить с m$ sql несколько весьма интересных вариантов :'(
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38572466
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

Не получается заниматься этим на лыжах в гамаке?
Ну ок, попробуй взять сноуборд.
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38572752
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryпопробуй взять сноуборд.Очень глубокая фраза, спасибо. Ещё бы понять, к чему ты её тут вдвинул.
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38573071
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

Может, сравнение не совсем удачное, но мне так показалось.
Создаёшь какую-то надуманную позицию (и всё-таки в гамаке!), чтобы сверить её с MSSQL, в котором в этом месте почему-то нет отклонения от стандарта, или оно в другую сторону.
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38573092
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryСоздаёшь какую-то надуманную позицию (и всё-таки в гамаке!), чтобы сверить её с MSSQLЭта позиция "надумана" не мной. Для тестирования ФБ-3 надо скармливать ему некое множество запросов, подчас - сверхнавороченных, и сверять с ms_sql-вариантом:
1) данные релалтсета
2) произв-сть.
По пункту "1)" могу сказать, что выловил уже несколько багов (они пофиксены были еще осенью). И никогда бы их не нашёл, если бы сверял только "обычные запросы", которые в нашем продакшене, скажем.
А по пункту "2)" говорить ничего не буду. Грустно там всё на сегодняшний день... :'(

WildSeryв котором в этом месте почему-то нет отклонения от стандарта, или оно в другую сторону. В этом месте у MS SQL (и у орацла тоже) НЕТ его, отклонения. Ни в какую "другую сторону".
А вот то, что у них строки соединяются "+" - задолбало сильно. Иногда сразу видно, где реплейс надо делать, а иногда вглядываться приходится: ИБЭ не указывает это место. Ну, и convert() достаёт по самое не могу.
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38573114
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

вариант

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with
c1 as(
  select 1 i, 2 k from rdb$database union all
  select 1 i, 2 k from rdb$database union all
  select 2 i, 3 k from rdb$database union all
  select 2 i, 3 k from rdb$database union all
  select 5 i, 5 k from rdb$database
)
,c2 as(
  select i, k
  from c1
)
select i, min(k)over() k
from c2
group by c2.i, c2.k



работает
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38573129
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
Код: sql
1.
group by c2.i, c2.k

работаетя понял, псип!
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38573163
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

что там по производительности. Приведи пример
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38573227
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисчто там по производительности. Приведи примерУвы, не имею права эти запросы приводить. Это с sql-ex.ru, смотрю их в форумах решенных мной задач.
Надо будет тестовые базы оттуда полностью переделать, алиасы столбов поменять, да и сами запросы тоже рихтануть как следует. А это время.

Но по многим вариантам мы проигрываем в десятки раз. Особливо где есть full join'ы, да и outer join'ы в MS SQL могут быть выполнены через HJ, а у нас - пока что нет.
Причём, ФБ проверяю на мощном линух-серваке, а маздай - на PC-чахотке.

ЗЫ. Утешительный приз: если в запрос числа счастливых билетов, который по сути есть кросс-джойн, искуственно добавить дебилоидные условия соединения типа 'on c1.i*0 = c2.i*0' и только после них - where с суммами цифр, то ФБ начнёт делать его HASH join'ом.
И это будет быстрее NL:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with recursive c as(
  select 0 id from rdb$database union all select c.id+1 from c where c.id<9
)
select count(*)
from c c1
join c c2 on c1.id*0=c2.id*0
join c c3 on c2.id*0=c3.id*0
join c c4 on c3.id*0=c4.id*0
join c c5 on c4.id*0=c5.id*0
join c c6 on c5.id*0=c6.id*0
join c c7 on c6.id*0=c7.id*0
join c c8 on c7.id*0=c8.id*0
where c1.id+c2.id+c3.id+c4.id = c5.id+c6.id+c7.id+c8.id



Trace:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
PLAN HASH (HASH (HASH (HASH (HASH (HASH (HASH (C RDB$DATABASE NATURAL, , C RDB$DATABASE NATURAL, ), C RDB$DATABASE NA
TURAL, ), C RDB$DATABASE NATURAL, ), C RDB$DATABASE NATURAL, ), C RDB$DATABASE NATURAL, ), C RDB$DATABASE NATURAL, ),
 C RDB$DATABASE NATURAL, )
1 records fetched
 112536 ms, 48 fetch(es)

Table                             Natural
*****************************************
RDB$DATABASE                            8

Против прежних 166859 ms при NL.
Это - сравнение ФБ с ФБ, не с маздаем: тут он нам проиграл ( на чахотке, впрочем :))
Код: plaintext
1.
2.
3.
4.
5.
(1 row(s) affected)
Table 'Worktable'. Scan count 16, logical reads 488, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
   CPU time = 80453 ms,  elapsed time = 149516 ms.
Кстати, и орацле ненамного впереди (так сервер мощнее моего):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SH@ao61 16:57:24>with c as(
  2    select level-1 id from dual connect by level<=10
  3  )
  4  select count(*)
  5  from c c1
  6  ,c c2,c c3,c c4,c c5,c c6,c c7,c c8
  7  --join c c2 on c1.id*0=c2.id*0
  8  --join c c3 on c2.id*0=c3.id*0
  9  --join c c4 on c3.id*0=c4.id*0
 10  --join c c5 on c4.id*0=c5.id*0
 11  --join c c6 on c5.id*0=c6.id*0
 12  --join c c7 on c6.id*0=c7.id*0
 13  --join c c8 on c7.id*0=c8.id*0
 14  where c1.id+c2.id+c3.id+c4.id = c5.id+c6.id+c7.id+c8.id;

  COUNT(*)
----------
   4816030

Elapsed: 00:01:04.81
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38573325
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

я думал ты про оконные функции. Я кстати тут вижу пока один большой недостаток. в FB не реализовано кадрирование.

ТаблоидЗЫ. Утешительный приз: если в запрос числа счастливых билетов, который по сути есть кросс-джойн, искуственно добавить дебилоидные условия соединения типа 'on c1.i*0 = c2.i*0' и только после них - where с суммами цифр, то ФБ начнёт делать его HASH join'ом.

ждём применения патча от ДЕ с материализацией DT. Помниться в одном из обсуждений тест с подсчётом счастливых билетов просто летал.

Насколько я понял HASH JOIN для outer joinов в тройке ждать не стоит, но возможно они появятся в 3.x, где x>0
...
Рейтинг: 0 / 0
Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
    #38573367
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денися думал ты про оконные функции. Я кстати тут вижу пока один большой недостаток. в FB не реализовано кадрирование.хорошо, что глючить перестали (left_тьфу*3): сужу по большому кол-ву сверенных с маздаем результатов.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Cannot use an aggreg function in a GROUP BY при замене алиаса столба на 1 из группируемых
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]