Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Изящный select / 25 сообщений из 25, страница 1 из 1
01.04.2020, 18:20
    #39942956
Dr_Grizzly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
Всем привет! Бьюсь над запросом уже третий день, не могу решить задачку.
есть таблица со значениями, как из этого набора получить значение по условию - 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
01.04.2020, 18:35
    #39942962
mRdUKE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
Dr_Grizzly,
Код: sql
1.
select * from (select * from def_table order by type desc) where rownum=1
...
Рейтинг: 0 / 0
01.04.2020, 18:50
    #39942965
Dr_Grizzly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
Капец! А до слез просто.... я столько бился над агрегатными функциями,а надо было всего лишь взять одну строку сортированную )))))) Спасибо большущее!!!
...
Рейтинг: 0 / 0
01.04.2020, 18:58
    #39942967
Dr_Grizzly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
Хотя не совсем подошло для общего примера... Для одного набора данных все ок. Ща пример расширю

Код: 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
01.04.2020, 18:58
    #39942968
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
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
01.04.2020, 19:11
    #39942969
Dr_Grizzly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
Попробовал вот так

Код: 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
01.04.2020, 20:30
    #39942990
mRdUKE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
Dr_Grizzly,

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


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


....
stax
...
Рейтинг: 0 / 0
02.04.2020, 10:35
    #39943083
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
...
Рейтинг: 0 / 0
02.04.2020, 18:22
    #39943249
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
Код: 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
05.04.2020, 20:47
    #39944148
merch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
Staxесть такие изящные ф-ции first/last_value

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


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

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

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


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

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

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

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

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

Контрпример?
...
Рейтинг: 0 / 0
06.04.2020, 14:53
    #39944276
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
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
06.04.2020, 16:01
    #39944289
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
Stax
но не встречал в доке (правда я и читаю с трудом, не говоря уж о понимании)
Может тогда не надо нести своего недомыслия в массы?
...
Рейтинг: 0 / 0
06.04.2020, 17:04
    #39944309
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
Stax
правда я и читаю с трудом, не говоря уж о понимании
Тогда можно рассматривать картинки!

Если таки захочется почитать - Row Pattern Navigation Operations .
...
Рейтинг: 0 / 0
06.04.2020, 17:25
    #39944318
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
Кобанчег
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
06.04.2020, 17:36
    #39944327
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
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
06.04.2020, 18:07
    #39944334
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
понятно что для х

Код: 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
06.04.2020, 18:12
    #39944335
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
Stax
так вот, ета одна строка гарантировано будет из первого правила (в andrey_anonymous ето strt (не из х))?
Такое понятие как первость правила вообще отсутствует.
Зато есть такое понятие как pattern variables.
...
Рейтинг: 0 / 0
06.04.2020, 18:25
    #39944343
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
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
07.04.2020, 07:22
    #39944463
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
Stax
понятно что для х
Мы должны додумывать твой поток сознания?
...
Рейтинг: 0 / 0
07.04.2020, 08:51
    #39944474
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изящный select
Кобанчег,

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

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

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

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


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