Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over / 10 сообщений из 10, страница 1 из 1
08.06.2021, 15:44
    #40076444
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
Добрый день!
Ранее писал уже тему, ссылка ниже.
https://www.sql.ru/forum/1336132/vyvesti-znachenie-pri-maksimalnom-value-i-prosummirovat-vse-ostalnye-value

Напомню пример:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t as (
   select 2 gr, 1 value, 22 tr from dual union all
  select 2 gr, 0 value, 33 tr from dual union all
  select 2 gr, 120 value, 41 tr from dual union all
  select 5 gr, 2 value, 22 tr from dual union all
  select 5 gr, 3 value, 33 tr from dual union all
  select 5 gr, 56 value, 34 tr from dual union all
  select 9 gr, 20 value, 33 tr from dual union all
  select 9 gr, 2 value, 34 tr from dual union all
 select 9 gr, 12 value, 35 tr from dual
 )
 select gr,sum(value) sv,max(tr)  KEEP (DENSE_RANK last ORDER BY value) mtr
 from t group by gr
 order by 1




Можно ли здесь уйти от группировки и от max() KEEP (DENSE_RANK), заменив это на аналитическую функцию, к примеру over?
...
Рейтинг: 0 / 0
08.06.2021, 16:19
    #40076456
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
zorlo
Можно ли здесь уйти от группировки и от max() KEEP (DENSE_RANK), заменив это на аналитическую функцию, к примеру over?

Можно, но зачем?
Код: plsql
1.
2.
3.
4.
 select gr
      , sum(value) over(partition by gr) sv
      , last_value(tr) over(partition by gr ORDER BY value rows between unbounded preceding and unbounded following) mtr
 from t
...
Рейтинг: 0 / 0
08.06.2021, 16:56
    #40076464
=nomad=
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
А я не понял сути вопроса: вам сгруппированные строки нужны или именно все строки? Ну если второе (как в последнем ответе), то добавьте тогда over(partition by ... ) в сам KEEP (DENSE_RANK...)
...
Рейтинг: 0 / 0
08.06.2021, 17:16
    #40076467
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
zorlo,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2     select 2 gr, 1 value, 22 tr from dual union all
  3    select 2 gr, 0 value, 33 tr from dual union all
  4    select 2 gr, 120 value, 41 tr from dual union all
  5    select 5 gr, 2 value, 22 tr from dual union all
  6    select 5 gr, 3 value, 33 tr from dual union all
  7    select 5 gr, 56 value, 34 tr from dual union all
  8    select 9 gr, 20 value, 31 tr from dual union all
  9    select 9 gr, 20 value, 33 tr from dual union all
 10    select 9 gr, 2 value, 34 tr from dual union all
 11   select 9 gr, 12 value, 35 tr from dual
 12   )
 13   select gr,sum(value) sv,to_number(substr(max(to_char(gr,'9990')||to_char(value,'9990')||to_char(tr,'9990')),11)) mtr
 14   from t group by gr
 15*  order by 1
SQL> /

        GR         SV        MTR
---------- ---------- ----------
         2        121         41
         5         61         34
         9         54         33



.....
stax
...
Рейтинг: 0 / 0
09.06.2021, 10:03
    #40076544
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
=nomad=,

Цель была уйти от групповой функции к аналитической
...
Рейтинг: 0 / 0
09.06.2021, 10:07
    #40076545
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
andrey_anonymous,

Так работает, но получаются дубли, я тоже думал про это решение, но как уйти от дублей не знаю.
...
Рейтинг: 0 / 0
09.06.2021, 10:15
    #40076546
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
Stax,

Работает, но tr у меня текстовое поле, плохой пример привёл((

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t as (
   select 2 gr, 1 value, 'te22' tr from dual union all
  select 2 gr, 0 value, 'te33' tr from dual union all
  select 2 gr, 120 value, 'te41' tr from dual union all
  select 5 gr, 2 value, 'te22' tr from dual union all
  select 5 gr, 3 value, 'te33' tr from dual union all
  select 5 gr, 56 value, 'te34' tr from dual union all
  select 9 gr, 20 value, 'te33' tr from dual union all
  select 9 gr, 2 value, 'te34' tr from dual union all
 select 9 gr, 12 value, 'te35' tr from dual
 )
 select gr,sum(value) sv,to_number(substr(max(to_char(gr,'9990')||to_char(value,'9990')||to_char(tr,'9990')),11)) mtr
 from t group by gr
 order by 1
...
Рейтинг: 0 / 0
09.06.2021, 10:19
    #40076547
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
Вот так попробовал, но это лишний подзапрос, нужно уложить в один запрос

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 with t as (
  select 2 gr, 1 value, 'te22' tr from dual union all
  select 2 gr, 0 value, 'te33' tr from dual union all
  select 2 gr, 120 value, 'te41' tr from dual union all
  select 5 gr, 2 value, 'te22' tr from dual union all
  select 5 gr, 3 value, 'te33' tr from dual union all
  select 5 gr, 56 value, 'te34' tr from dual union all
  select 9 gr, 20 value, 'te33' tr from dual union all
  select 9 gr, 2 value, 'te34' tr from dual union all
 select 9 gr, 12 value, 'te35' tr from dual
 )
 --select * from t
 select gr, sum(value), tr from (
 select gr,value, last_value(tr) over (partition by GR order by value rows  BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as tr-- sv,max(tr)  KEEP (DENSE_RANK last ORDER BY value) mtr
 from t group by gr, tr, value
 order by 1)
 group by gr, tr
 order by gr
...
Рейтинг: 0 / 0
09.06.2021, 11:22
    #40076559
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
zorlo,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2     select 2 gr, 1 value, 'te22' tr from dual union all
  3    select 2 gr, 0 value, 'te33' tr from dual union all
  4    select 2 gr, 120 value, 'te41' tr from dual union all
  5    select 5 gr, 2 value, 'te22' tr from dual union all
  6    select 5 gr, 3 value, 'te33' tr from dual union all
  7    select 5 gr, 56 value, 'te34' tr from dual union all
  8    select 9 gr, 20 value, 'tz33' tr from dual union all
  9    select 9 gr, 2 value, 'ty34' tr from dual union all
 10   select 9 gr, 12 value, 'tx35' tr from dual
 11   )
 12   select gr,sum(value) sv,substr(max(to_char(gr,'9990')||to_char(value,'9990')||tr),11) mtr
 13   from t group by gr
 14*  order by 1
SQL> /

        GR         SV MTR
---------- ---------- ----
         2        121 te41
         5         61 te34
         9         34 tz33

SQL>


......
stax
...
Рейтинг: 0 / 0
09.06.2021, 12:39
    #40076581
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
with t as (
  select 2 gr, 1 value, 'te22' tr from dual union all
  select 2 gr, 0 value, 'te33' tr from dual union all
  select 2 gr, 120 value, 'te41' tr from dual union all
  select 5 gr, 2 value, 'te22' tr from dual union all
  select 5 gr, 3 value, 'te33' tr from dual union all
  select 5 gr, 56 value, 'te34' tr from dual union all
  select 9 gr, 20 value, 'te33' tr from dual union all
  select 9 gr, 2 value, 'te34' tr from dual union all
 select 9 gr, 12 value, 'te35' tr from dual
 )
select  gr,
        value,
        tr
  from  t
  match_recognize(
                  partition by gr
                  order by value
                  measures
                    sum(value) value,
                    last(tr) tr
                  one row per match
                  pattern(p+)
                  define p as 1 = 1
                 )
  order by gr
/

        GR      VALUE TR
---------- ---------- ----
         2        121 te41
         5         61 te34
         9         34 te33

SQL>



SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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