powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Именованное окно для аналитических функция
25 сообщений из 55, страница 1 из 3
Именованное окно для аналитических функция
    #39410141
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увидел в PostgreSQL такую удобную штуку:
Код: sql
1.
2.
3.
4.
select row_number() over W as RN
from ...
window W as (partition by CLIENT_ID order by MOMENT)
...


А есть ли такое в Oracle?
У меня есть несколько многоэтажных запросов, они бы существенно сократились.
Да и выглядит на мой взгляд удобнее.
На диаграммах я такой возможности не вижу, но может быть не там ищу.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39410151
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
WITH T AS (
           SELECT  ...,
                   многоэтажное-вычисление AS MOMENT
           ...
          )
select row_number() (partition by CLIENT_ID order by MOMENT) as RN
from ...
...



SY.
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39410157
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

думаю что, нет

да и не так часто мне ето нужно
или я не понял фичу

мне было-бы удобно
1) group by 1,3
2) із май скуеля select x a,a*x a2, a2*x a3 ...

.....
stax
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39410722
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY , я про другую "многоэтажность".
Код: sql
1.
2.
3.
4.
5.
6.
7.
select row_number() over W as RN
, count(*) over W as CNT
, sum(SCORE) over W as SUM
, lead(MOMENT) over W as NEXT
from ...
window W as (partition by CLIENT_ID order by MOMENT)
...
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39410830
Alibek B. SY , я про другую "многоэтажность".
Код: sql
1.
2.
3.
4.
5.
6.
7.
select row_number() over W as RN
, count(*) over W as CNT
, sum(SCORE) over W as SUM
, lead(MOMENT) over W as NEXT
from ...
window W as (partition by CLIENT_ID order by MOMENT)
...


Открой для себя макроподстановки (&)
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39411415
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..мне было-бы удобно
1) group by 1,3Этого не будет, потому что не может быть никогда.
order by выполняется в последнюю очередь, когда уже все посчитано.
После group by выполняется аналитика и прочее.
Абсолютно некорректно было бы использовать номера столбцов в group by, если сами значения будут посчитаны после применения оного.
Пример
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> select count(*) over() cnt1
  2    from table(sys.odcinumberlist(1, 1));

      CNT1
----------
         2
         2

SQL> select count(*) over() cnt1, count(*) cnt2
  2    from table(sys.odcinumberlist(1, 1));

      CNT1       CNT2
---------- ----------
         1          2

SQL> select count(*) over() cnt1, count(*) cnt2
  2    from table(sys.odcinumberlist(1, 1))
  3   group by 1;

      CNT1       CNT2
---------- ----------
         1          2

То есть, в третьем случае, если трактовать 1 не как выражение, а как номер столбца,
то ты ожидаешь, что изменился бы порядок выполнения запроса, и аналитика выполнилась перед группировкой, что привело бы к результату
Код: plaintext
2 2
?
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420088
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopstax..мне было-бы удобно
1) group by 1,3Этого не будет, потому что не может быть никогда.
order by выполняется в последнюю очередь, когда уже все посчитано.
После group by выполняется аналитика и прочее.
Абсолютно некорректно было бы использовать номера столбцов в group by, если сами значения будут посчитаны после применения оного.
Пример
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> select count(*) over() cnt1
  2    from table(sys.odcinumberlist(1, 1));

      CNT1
----------
         2
         2

SQL> select count(*) over() cnt1, count(*) cnt2
  2    from table(sys.odcinumberlist(1, 1));

      CNT1       CNT2
---------- ----------
         1          2

SQL> select count(*) over() cnt1, count(*) cnt2
  2    from table(sys.odcinumberlist(1, 1))
  3   group by 1;

      CNT1       CNT2
---------- ----------
         1          2

То есть, в третьем случае, если трактовать 1 не как выражение, а как номер столбца,
то ты ожидаешь, что изменился бы порядок выполнения запроса, и аналитика выполнилась перед группировкой, что привело бы к результату
Код: plaintext
2 2

?

то что не будет то я верю, а вот что невозможно нет

в Вашем последним случае должен дать ошибку
ORA-30483: window functions are not allowed here


Код: plsql
1.
2.
3.
4.
5.
6.
7.
  1  select row_number() over (partition by deptno order by ename) rn,sum(sal) ss from emp
  2* group by row_number() over (partition by deptno order by ename)
SQL> /
group by row_number() over (partition by deptno order by ename)
         *
ERROR at line 2:
ORA-30483: window  functions are not allowed here



аналитику нельзя в group by при любой "нотации"
какой результат, ет другой вопрос

......
stax
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420148
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,

Аналитика - это лишь пример. Там может быть скаляр или прочее.
Суть в том, что сортировка последняя, до нее все вычислено и можно использовать номера столбцов.
Гриппировка - далеко не последняя операция и выполнении запроса отсюда хотелка нерациональна.

Это не рассматривая более сложные комбинации.

Например.
Пытаемся натянуть модель с неуникальной адресацией в измирении - закономерно получаем ошибку
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> with t as (select column_value id from table(sys.odcinumberlist(1, 2, 3)))
  2  select mod(id, 2) mi, x
  3  from t
  4  --group by mod(id, 2), x
  5  model
  6  --unique single reference
  7  dimension by (mod(id,2) id)
  8  measures (0 x)
  9  (x[0]=-1)
 10  /
from t
     *
ERROR at line 3:
ORA-32638: Non unique addressing in MODEL dimensions

Добавляем уникальность в используемых правилах, а не по всему измерению - ОК
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> with t as (select column_value id from table(sys.odcinumberlist(1, 2, 3)))
  2  select mod(id, 2) mi, x
  3  from t
  4  --group by mod(id, 2), x
  5  model
  6  unique single reference
  7  dimension by (mod(id,2) id)
  8  measures (0 x)
  9  (x[0]=-1)
 10  /

        MI          X
---------- ----------
         1          0
         1          0
         0         -1

Предварительно группируем и убираем "unique single reference" - тоже работает ОК (результат закономерно "схлопнутый")
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> with t as (select column_value id from table(sys.odcinumberlist(1, 2, 3)))
  2  select mod(id, 2) mi, x
  3  from t
  4  group by mod(id, 2)--, x
  5  model
  6  --unique single reference
  7  dimension by (mod(id,2) id)
  8  measures (0 x)
  9  (x[0]=-1)
 10  /

        MI          X
---------- ----------
         1          0
         0         -1

Теперь пытаемся группировать по обоим атрибутам выборки
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> with t as (select column_value id from table(sys.odcinumberlist(1, 2, 3)))
  2  select mod(id, 2) mi, x
  3  from t
  4  group by mod(id, 2), x
  5  model
  6  --unique single reference
  7  dimension by (mod(id,2) id)
  8  measures (0 x)
  9  (x[0]=-1)
 10  /
group by mod(id, 2), x
                     *
ERROR at line 4:
ORA-00904: "X": invalid identifier

Про X на этапе группировки вообще ничего не изветсно!
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420156
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,
причем сдесь модель,
нельзя при любой нотации указывать "столбец" из measures,
ошибку выдало не из-за указания порядкового номера/алиаса (1,2 ...)

как бы выглядел пример, если БЫ ...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> with t as (select column_value id from table(sys.odcinumberlist(1, 2, 3)))
  2  select mod(id, 2) mi, x
  3  from t
  4  group by mi --, x
  5  model
  6  --unique single reference
  7  dimension by (mi id)
  8  measures (0 x)
  9  (x[0]=-1)
 10  /



......
stax
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420162
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..dbms_photoshop,
причем сдесь модель,
нельзя при любой нотации указывать "столбец" из measures,
ошибку выдало не из-за указания порядкового номера/алиаса (1,2 ...)

как бы выглядел пример, если БЫ ...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> with t as (select column_value id from table(sys.odcinumberlist(1, 2, 3)))
  2  select mod(id, 2) mi, x
  3  from t
  4  group by mi --, x
  5  model
  6  --unique single reference
  7  dimension by (mi id)
  8  measures (0 x)
  9  (x[0]=-1)
 10  /



......
staxЯ на конкретных примерах пытаюсь донести мысль, что вот это
stax..мне было-бы удобно
1) group by 1,3
абсурд.

В том и дело, что многие колонки вычисляются после группировки, поэтому хотеть использовать нумерацию в группировке несколько странно.

Ты общаешься в духе
YouTube Video
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420168
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понимаю, речь совсем о другом.
Дело не в том, что group by вычисляется не в самим конце — никто на значения столбцов и не ссылается.
Удобно вместо повтора выражения в двух местах (в select и в group by) указывать выражение только в одном месте (в select), а в group by указывать просто номер столбца из select, из которого нужно использовать выражение. Особенно это удобно для многоэтажных выражений, которые в этом случае можно было бы указывать только один раз:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select type_id
, case
...
  end as grp1
, case
...
  end as grp2
, count(*) as cnt
from ...
group by type_id, 2, 3


Не то, чтобы без этого нельзя было бы прожить, но это удобство, которое несложно было бы реализовать (парсер при выявлении номера столбца просто бы подставлял вместо номера выражение из select).
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420173
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Ты ничего не понял как и Станислав. Ок, ждите.
stax..мне было-бы удобно
1) group by 1,3
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420174
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopstax..dbms_photoshop,
причем сдесь модель,
нельзя при любой нотации указывать "столбец" из measures,
ошибку выдало не из-за указания порядкового номера/алиаса (1,2 ...)

как бы выглядел пример, если БЫ ...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> with t as (select column_value id from table(sys.odcinumberlist(1, 2, 3)))
  2  select mod(id, 2) mi, x
  3  from t
  4  group by mi --, x
  5  model
  6  --unique single reference
  7  dimension by (mi id)
  8  measures (0 x)
  9  (x[0]=-1)
 10  /



......
staxЯ на конкретных примерах пытаюсь донести мысль, что вот это
stax..мне было-бы удобно
1) group by 1,3
абсурд.

В том и дело, что многие колонки вычисляются после группировки, поэтому хотеть использовать нумерацию в группировке несколько странно.

не надо бездумно колонки впихивать в group by, из модель/аналитики оракля их по любому не пропускает, хотя аналитику мог и пропустить

что ораклю не понятно в примере
Код: plsql
1.
2.
3.
4.
5.
6.
7.
  1  select row_number() over (partition by deptno order by ename) rn,sum(sal) ss from emp
  2* group by row_number() over (partition by deptno order by ename)
SQL> /
group by row_number() over (partition by deptno order by ename)
         *
ERROR at line 2:
ORA-30483: window  functions are not allowed here



Вы меня не переубедили

.....
stax
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420180
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.никто на значения столбцов и не ссылается
И что тогда должно означать?
Код: plsql
1.
select rownum, count(*) over() from таблица group by rollup(1, 2)
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420184
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..Вы меня не переубедили Да я уже и не пытаюсь.
Тебя же совершенно не смущает, что, если в запросе 10 колонок, то может случиться так, что в группировке ты сможешь указывать только, скажем
2,5,7
потому что остальные считаются после группировки.
А в скортировке ты можешь указывать всегда любую комбинацию.
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420187
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Насколько я понимаю, речь совсем о другом.
Дело не в том, что group by вычисляется не в самим конце — никто на значения столбцов и не ссылается.
Удобно вместо повтора выражения в двух местах (в select и в group by) указывать выражение только в одном месте (в select), а в group by указывать просто номер столбца из select, из которого нужно использовать выражение. Особенно это удобно для многоэтажных выражений, которые в этом случае можно было бы указывать только один раз:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select type_id
, case
...
  end as grp1
, case
...
  end as grp2
, count(*) as cnt
from ...
group by type_id, 2, 3


Не то, чтобы без этого нельзя было бы прожить, но это удобство, которое несложно было бы реализовать (парсер при выявлении номера столбца просто бы подставлял вместо номера выражение из select).

не обязательно номер, удобно и алиас
я номер привел, чтоб более понятно было о чем я

.....
stax
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420189
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично меня, тут больше вероятность ошибки пугает. Удалили/добавили поле в select list и все. Нумерация уехала, фиг ошибку найдешь и обратно реконструируешь, какая же идея была в запрос исходным автором вложена.

С учетом, что в системах под Oracle бывают НУ ОЧЕНЬ большие и многовложенные запросы - контроль синтаксиса и ошибок станет просто смертельный.

Copy / past выражений тоже раздражает. Но указание колонок по номеру, приведет к полному падению supportability кода.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420193
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Alibek B.никто на значения столбцов и не ссылается
И что тогда должно означать?
Код: plsql
1.
select rownum, count(*) over() from таблица group by rollup(1, 2)



должен дать ошибку
ERROR at line 1:
ORA-00934: group function is not allowed here

.....
stax
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420210
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopstax..Вы меня не переубедили Да я уже и не пытаюсь.
Тебя же совершенно не смущает, что, если в запросе 10 колонок, то может случиться так, что в группировке ты сможешь указывать только, скажем
2,5,7
потому что остальные считаются после группировки.
А в скортировке ты можешь указывать всегда любую комбинацию.
почему меня должно смущать, я ж не бездумно указываю 2,5,7

меня ж не смущает что в ордер бай іногда проходіт только "позиционная/алиасная нотация"

ps
мне более інтересно в чем я неправ с коннект бай
....
stax
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420219
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЛично меня, тут больше вероятность ошибки пугает. Удалили/добавили поле в select list и все. Нумерация уехала, фиг ошибку найдешь и обратно реконструируешь, какая же идея была в запрос исходным автором вложена.

С учетом, что в системах под Oracle бывают НУ ОЧЕНЬ большие и многовложенные запросы - контроль синтаксиса и ошибок станет просто смертельный.

Copy / past выражений тоже раздражает. Но указание колонок по номеру, приведет к полному падению supportability кода.

IMHO & AFAIKну ладно, хрен с вами, лично мне тоже групп бай по номерам результирующих колонок нафиг не впал
давайте групп бай по алиасам тех колонок, уже можно?
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420221
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЛично меня, тут больше вероятность ошибки пугает. Удалили/добавили поле в select list и все. Нумерация уехала, фиг ошибку найдешь и обратно реконструируешь, какая же идея была в запрос исходным автором вложена.

С учетом, что в системах под Oracle бывают НУ ОЧЕНЬ большие и многовложенные запросы - контроль синтаксиса и ошибок станет просто смертельный.

Copy / past выражений тоже раздражает. Но указание колонок по номеру, приведет к полному падению supportability кода.

IMHO & AFAIK
а в ордер бай не смущает?
причем древних версиях иногда только позиционная
я понимаю что последствия несколько меньшие

я ж уточнял, в идеале не 1,4, а алиасы, если удалили ошибка


юююю
stax
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420223
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxдавайте групп бай по алиасам тех колонок, уже можно?

авторЭтого не будет, потому что не может быть никогда.



+1

.....
stax
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420224
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..а в ордер бай не смущает?
причем древних версиях иногда только позиционная
я понимаю что последствия несколько меньшие
staxбыло несколько раз, когда в результате неверной сортировки показывалась совершенно иная картина
когда приложение строит, например, какой-то аналог дерева
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420226
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxstax..а в ордер бай не смущает?
причем древних версиях иногда только позиционная
я понимаю что последствия несколько меньшие
staxбыло несколько раз, когда в результате неверной сортировки показывалась совершенно иная картина
когда приложение строит, например, какой-то аналог дерева
да я верю
топ N на основе ордер бай тоже важными бывают

.....
stax
...
Рейтинг: 0 / 0
Именованное окно для аналитических функция
    #39420231
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..andreymxдавайте групп бай по алиасам тех колонок, уже можно?

авторЭтого не будет, потому что не может быть никогда.



+1

.....
staxТы мои ответы не приписывай к иным формулировкам, ок?

Про connect by речь шла вообще в другой теме и я довольно внятно указал, что искать в доке.
Если интересуют детали - я описывал в The Power of Oracle SQL .
Но я один раз тебе давал ссылку, так что полагаю, что у тебя нет желания читать.
А у меня нет желания копипастить одно и то же и расжевывать по 100 раз.
На этом предлагаю и разойтись.
...
Рейтинг: 0 / 0
25 сообщений из 55, страница 1 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Именованное окно для аналитических функция
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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