powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Изящный select
25 сообщений из 25, страница 1 из 1
Изящный select
    #39942956
Dr_Grizzly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Бьюсь над запросом уже третий день, не могу решить задачку.
есть таблица со значениями, как из этого набора получить значение по условию - max(type) взяв поля name, val, bit?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
def_table:
Name | type | val | bit 
AAA      1     2    01
AAA      2     2    01
AAA      5     3    01

Необходим результат выбора чтобы попал на одну строку, где поле type имеет максимальное значение:
Name | val | bit 
AAA    3     01

Копал в сторону аналитических функций, но я как "мартышка и очки" с ними.. пока нет такой большой практики чтобы легко представить структуру запроса.

Может кто с ходу имеет решение? ) Буду очень благодарен!

PS Oracle 11
...
Рейтинг: 0 / 0
Изящный select
    #39942962
Фотография mRdUKE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr_Grizzly,
Код: sql
1.
select * from (select * from def_table order by type desc) where rownum=1
...
Рейтинг: 0 / 0
Изящный select
    #39942965
Dr_Grizzly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Капец! А до слез просто.... я столько бился над агрегатными функциями,а надо было всего лишь взять одну строку сортированную )))))) Спасибо большущее!!!
...
Рейтинг: 0 / 0
Изящный select
    #39942967
Dr_Grizzly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя не совсем подошло для общего примера... Для одного набора данных все ок. Ща пример расширю

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
def_table:
Name | type | val | bit 
AAA      1     2    01
AAA      2     2    01
AAA      5     3    01
BBB      2     4    02
BBB      3     1    02
....      .....  .... .....

Необходим результат выбора чтобы попал на одну строку, где поле type имеет максимальное значение:
Name | val | bit 
AAA    3     01
BBB    1     02
...
Рейтинг: 0 / 0
Изящный select
    #39942968
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mRdUKE
Dr_Grizzly,
Код: sql
1.
select * from (select * from def_table order by type desc) where rownum=1




Код: plsql
1.
2.
select * from def_table order by type desc
 fetch first 1 row only



SY.
...
Рейтинг: 0 / 0
Изящный select
    #39942969
Dr_Grizzly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал вот так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select d.name, d.val, d.bit
from def_table  d
join
(select name,       
          max(type) mtype,
          t.bit
  from def_table  t
group by t.name, t.bit
) gp
on t.name = gp.item and t.type = gp.mtype
...
Рейтинг: 0 / 0
Изящный select
    #39942990
Фотография mRdUKE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr_Grizzly,

.. row_number() over (partition by name order by type desc) rn .. ) where rn = 1
...
Рейтинг: 0 / 0
Изящный select
    #39943080
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr_Grizzly
я столько бился над агрегатными функциями


есть такие изящные ф-ции first/last_value
https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions059.htm#SQLRF00642


....
stax
...
Рейтинг: 0 / 0
Изящный select
    #39943083
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Изящный select
    #39943249
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
with def_table(myName, myType, myVal, myBit) as 
(select 'AAA',      1,     2,    '01'
from dual union all select 'AAA',      2,     2,    '01'
from dual union all select 'AAA',      5,     3,    '01'
from dual union all select 'BBB',      2,     4,    '02'
from dual union all select 'BBB',      3,     1,    '02'
from dual
)
select myName
     , max(myVal) keep(dense_rank last order by myType) myVal
     , max(myBit) keep(dense_rank last order by myType) myBit
  from def_table
 group by myName
;

with def_table(myName, myType, myVal, myBit) as 
(select 'AAA',      1,     2,    '01'
from dual union all select 'AAA',      2,     2,    '01'
from dual union all select 'AAA',      5,     3,    '01'
from dual union all select 'BBB',      2,     4,    '02'
from dual union all select 'BBB',      3,     1,    '02'
from dual
)
select * 
  from def_table match_recognize(
 partition by myName
 order by myType desc
 measures strt.myVal as myVal
        , strt.myBit as myBit
 one row per match
 pattern (strt x*)
 define x as myName=myName
 )
;

with def_table(myName, myType, myVal, myBit) as 
(select 'AAA',      1,     2,    '01'
from dual union all select 'AAA',      2,     2,    '01'
from dual union all select 'AAA',      5,     3,    '01'
from dual union all select 'BBB',      2,     4,    '02'
from dual union all select 'BBB',      3,     1,    '02'
from dual
)
select myName, myVal, myBit 
  from def_table 
model
  return updated rows
  partition by (myName)
  dimension by (myType r)
  measures(myType, myVal, myBit)
  rules ( myType[0] = max(myType)[any]
        , myVal[0] = myVal[myType[0]]
        , myBit[0] = myBit[myType[0]]
        )
;

with def_table(myName, myType, myVal, myBit) as 
(select 'AAA',      1,     2,    '01'
from dual union all select 'AAA',      2,     2,    '01'
from dual union all select 'AAA',      5,     3,    '01'
from dual union all select 'BBB',      2,     4,    '02'
from dual union all select 'BBB',      3,     1,    '02'
from dual
)
select myName, myVal, myBit from(
  select t.*
       , dense_rank() over(partition by myName order by myType desc) x
    from def_table t
) where x = 1
;
...
Рейтинг: 0 / 0
Изящный select
    #39944148
merch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxесть такие изящные ф-ции first/last_value

давно ты тыкаешь носом в документацию? если люди пишут, они явно ждут 100500 решений от стакса. Не важно каких, главное, чтобы были.
...
Рейтинг: 0 / 0
Изящный select
    #39944188
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
merch
Staxесть такие изящные ф-ции first/last_value


давно ты тыкаешь носом в документацию? если люди пишут, они явно ждут 100500 решений от стакса. Не важно каких, главное, чтобы были.

решение было 22109598

поетому рискнул дать ссылку и то неудачно


.....
stax
...
Рейтинг: 0 / 0
Изящный select
    #39944190
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

one row per match
Гарантирует ли оракля что ето будет первая (c макс myType) строка?

для pattern (x+) выводит не всегда первую (максимальную), хотя есть order by myType desc

зы
как обойти для all rows per match я догадываюсь

.....
stax
...
Рейтинг: 0 / 0
Изящный select
    #39944240
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
Гарантирует ли оракля что ето будет первая (c макс myType) строка?

Контрпример?
...
Рейтинг: 0 / 0
Изящный select
    #39944276
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous

Контрприклад?


вот такое, должно решать "получить одну строку с мах type"?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with def_table(myName, myType, myVal, myBit) as 
(select 'AAA',      1,     2,    '01'
from dual union all select 'AAA',      2,     2,    '01'
from dual union all select 'AAA',      5,     3,    '01'
from dual union all select 'BBB',      2,     4,    '02'
from dual union all select 'BBB',      3,     1,    '02'
from dual
)
select * 
  from def_table match_recognize(
 partition by myName
 order by myType desc
 measures strt.myVal as myVal
        , strt.myBit as myBit
 one row per match
 pattern (x+)
 define x as myName=myName
 )
;



зы
Контрприклада может и не быть, если первая гарантировна
но не встречал в доке (правда я и читаю с трудом, не говоря уж о понимании)
......
stax
...
Рейтинг: 0 / 0
Изящный select
    #39944289
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
но не встречал в доке (правда я и читаю с трудом, не говоря уж о понимании)
Может тогда не надо нести своего недомыслия в массы?
...
Рейтинг: 0 / 0
Изящный select
    #39944309
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
правда я и читаю с трудом, не говоря уж о понимании
Тогда можно рассматривать картинки!

Если таки захочется почитать - Row Pattern Navigation Operations .
...
Рейтинг: 0 / 0
Изящный select
    #39944318
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег
Stax
правда я и читаю с трудом, не говоря уж о понимании
Тогда можно рассматривать картинки!

Если таки захочется почитать - Row Pattern Navigation Operations .


вопрос (сомнения) не по етой диаграмке (картинке)

one row per match
вернуть одну строку из набора, я примерно так перевел

так вот, ета одна строка гарантировано будет из первого правила (в andrey_anonymous ето strt (не из х))?


ps
для 22111862 one row per match возвращает не первую (order by myType desc) строку


.....
stax
...
Рейтинг: 0 / 0
Изящный select
    #39944327
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
для 22111862 one row per match возвращает не первую (order by myType desc) строку
Врёшь:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> with def_table(myName, myType, myVal, myBit) as
  2  (select 'AAA',      1,     2,    '01'
  3  from dual union all select 'AAA',      2,     2,    '01'
  4  from dual union all select 'AAA',      5,     3,    '01'
  5  from dual union all select 'BBB',      2,     4,    '02'
  6  from dual union all select 'BBB',      3,     1,    '02'
  7  from dual
  8  )
  9  select *
 10    from def_table match_recognize(
 11   partition by myName
 12   order by myType desc
 13   measures strt.myVal as myVal
 14          , strt.myBit as myBit
 15   one row per match
 16   pattern (x+)
 17   define x as myName=myName
 18   )
 19  ;
 measures strt.myVal as myVal
          *
ERROR at line 13:
ORA-62504: illegal variable reference
...
Рейтинг: 0 / 0
Изящный select
    #39944334
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понятно что для х

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with def_table(myName, myType, myVal, myBit) as 
(select 'AAA',      1,     2,    '01'
from dual union all select 'AAA',      2,     2,    '01'
from dual union all select 'AAA',      5,     3,    '01'
from dual union all select 'BBB',      2,     4,    '02'
from dual union all select 'BBB',      3,     1,    '02'
from dual
)
select * 
  from def_table match_recognize(
 partition by myName
 order by myType desc
 measures x.myVal as myVal
        , x.myBit as myBit
 one row per match
 pattern (x+)
 define x as myName=myName
 )
;



.....
stax
...
Рейтинг: 0 / 0
Изящный select
    #39944335
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
так вот, ета одна строка гарантировано будет из первого правила (в andrey_anonymous ето strt (не из х))?
Такое понятие как первость правила вообще отсутствует.
Зато есть такое понятие как pattern variables.
...
Рейтинг: 0 / 0
Изящный select
    #39944343
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Если вопрос надо ли указывать running/final first/last для one row per match, то читай по приведенной ссылке раздел "RUNNING Versus FINAL Keywords"

In MEASURES with ONE ROW PER MATCH, all aggregates, FIRST, and LAST are computed after the last row of the match is recognized, so that the default RUNNING semantics is actually no different from FINAL semantics. The user may prefer to think of expressions defaulting to FINAL in these cases or the user may choose to write FINAL for added clarity.

If ONE ROW PER MATCH is specified, then conceptually the query is positioned on the last row of the match. An ordinary column reference references the last row that is mapped to the pattern variable. If the variable is not mapped to any row, then the value is null.
Consequently, an ordinary column reference such as X.Price is equivalent to RUNNING LAST (X.Price).
...
Рейтинг: 0 / 0
Изящный select
    #39944463
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
понятно что для х
Мы должны додумывать твой поток сознания?
...
Рейтинг: 0 / 0
Изящный select
    #39944474
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег,

кажись наконец то понял

так как указано strt., то вернет одну строку из strt

спасибо
.....
stax
...
Рейтинг: 0 / 0
Изящный select
    #39944477
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
Код: plsql
1.
 pattern (strt x*)

оракл в случаи one row per match гарантировано вернет запись с strt (с первой pattern variable), а не с х?
Независимо от row per match, strt - это ровно одна строка. Она и первая, и последняя, и средняя даже.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Изящный select
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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