Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Именованное окно для аналитических функция / 25 сообщений из 55, страница 1 из 3
25.02.2017, 14:19
    #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
25.02.2017, 15:09
    #39410151
SY
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
25.02.2017, 15:37
    #39410157
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованное окно для аналитических функция
Alibek B.,

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

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

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

.....
stax
...
Рейтинг: 0 / 0
27.02.2017, 11:31
    #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
27.02.2017, 12:33
    #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
28.02.2017, 09:59
    #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
15.03.2017, 15:36
    #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
15.03.2017, 16:35
    #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
15.03.2017, 16:46
    #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
15.03.2017, 16:57
    #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
15.03.2017, 17:12
    #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
15.03.2017, 17:18
    #39420173
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованное окно для аналитических функция
Alibek B.,

Ты ничего не понял как и Станислав. Ок, ждите.
stax..мне было-бы удобно
1) group by 1,3
...
Рейтинг: 0 / 0
15.03.2017, 17:18
    #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
15.03.2017, 17:24
    #39420180
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованное окно для аналитических функция
Alibek B.никто на значения столбцов и не ссылается
И что тогда должно означать?
Код: plsql
1.
select rownum, count(*) over() from таблица group by rollup(1, 2)
...
Рейтинг: 0 / 0
15.03.2017, 17:25
    #39420184
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованное окно для аналитических функция
stax..Вы меня не переубедили Да я уже и не пытаюсь.
Тебя же совершенно не смущает, что, если в запросе 10 колонок, то может случиться так, что в группировке ты сможешь указывать только, скажем
2,5,7
потому что остальные считаются после группировки.
А в скортировке ты можешь указывать всегда любую комбинацию.
...
Рейтинг: 0 / 0
15.03.2017, 17:28
    #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
15.03.2017, 17:30
    #39420189
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Именованное окно для аналитических функция
Лично меня, тут больше вероятность ошибки пугает. Удалили/добавили поле в select list и все. Нумерация уехала, фиг ошибку найдешь и обратно реконструируешь, какая же идея была в запрос исходным автором вложена.

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

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

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

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

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

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

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

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

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

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

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

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


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

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



+1

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

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

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



+1

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

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


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