powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
10 сообщений из 10, страница 1 из 1
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
    #40076444
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Ранее писал уже тему, ссылка ниже.
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
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
    #40076456
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
    #40076464
=nomad=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я не понял сути вопроса: вам сгруппированные строки нужны или именно все строки? Ну если второе (как в последнем ответе), то добавьте тогда over(partition by ... ) в сам KEEP (DENSE_RANK...)
...
Рейтинг: 0 / 0
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
    #40076467
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
    #40076544
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
=nomad=,

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

Так работает, но получаются дубли, я тоже думал про это решение, но как уйти от дублей не знаю.
...
Рейтинг: 0 / 0
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
    #40076546
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Можно ли заменить конструкцию max() KEEP (DENSE_RANK) на аналитическу функцию over
    #40076547
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так попробовал, но это лишний подзапрос, нужно уложить в один запрос

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


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