Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 keep+over+nls_lang = bag или фича?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
стандратные настройки базы nls_language = 'AMERICAN'
with t as (
select '01' idn from dual union all
select '11' idn from dual union all
select '29' idn from dual union all
select '20' idn from dual union all
select 'A0' idn from dual union all
select 'AA' idn from dual
)
select t.*,row_number() over (order by idn), max(idn) keep(dense_rank last order by idn) over()
from t order by idn


alter session set nls_language = 'RUSSIAN'
и еще раз запрос
with t as (
select '01' idn from dual union all
select '11' idn from dual union all
select '29' idn from dual union all
select '20' idn from dual union all
select 'A0' idn from dual union all
select 'AA' idn from dual
)
select t.*,row_number() over (order by idn), max(idn) keep(dense_rank last order by idn) over()
from t order by idn
в результате keep`у на изменившиеся настройки nls_language положить или это меня так старательно глючит?
проверял на 10.2.0.4 и 11.2.0.1
24 мар 11, 11:02    [10417324]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
понятнее было бы вместо row_number() подставить
LAST_value(idn) over (order by idn rows between unbounded preceding and unbounded following)
24 мар 11, 11:10    [10417376]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
-2-
Member

Откуда:
Сообщений: 15330
keep работает внутри группы max- или min- значений.
alter session set nls_sort=binary;

select t.*,row_number() over (order by idn), max(idn) keep(dense_rank last order by idn) over()
, max(idn) over()
from t order by idn;

IDN ROW_NUMBER()OVER(ORDERBYIDN) MAX(IDN)KEEP(DENSE_RANKLASTORDERBYIDN)OVER() MAX(IDN)OVER() 
--- ---------------------------- -------------------------------------------- -------------- 
01  1                            AA                                           AA             
11  2                            AA                                           AA             
20  3                            AA                                           AA             
29  4                            AA                                           AA             
A0  5                            AA                                           AA             
AA  6                            AA                                           AA             


alter session set nls_sort=russian;

select t.*,row_number() over (order by idn), max(idn) keep(dense_rank last order by idn) over()
, max(idn) over()
from t order by idn;

IDN ROW_NUMBER()OVER(ORDERBYIDN) MAX(IDN)KEEP(DENSE_RANKLASTORDERBYIDN)OVER() MAX(IDN)OVER() 
--- ---------------------------- -------------------------------------------- -------------- 
AA  1                            AA                                           AA             
A0  2                            AA                                           AA             
01  3                            AA                                           AA             
11  4                            AA                                           AA             
20  5                            AA                                           AA             
29  6                            AA                                           AA             

24 мар 11, 11:14    [10417398]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
мда.. надо было сразу писать с first_value пример))
+
--alter session set nls_language = 'RUSSIAN'
with t as (
select '01' idn from dual union all
select '11' idn from dual union all
select '29' idn from dual union all
select '20' idn from dual union all
select 'A0' idn from dual union all
select 'AA' idn from dual
)
select t.*,row_number() over (order by idn), max(idn) keep(dense_rank first order by idn) over(),
first_value(idn) over (order by idn rows between unbounded preceding and unbounded following)
from t order by idn
	AA	1	01	AA
	A0	2	01	AA
	01	3	01	AA
	11	4	01	AA
	20	5	01	AA
	29	6	01	AA

как обьяснить такой результат?)
24 мар 11, 11:18    [10417427]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
-2-
Member

Откуда:
Сообщений: 15330
Vint
как обьяснить такой результат?)
max/min используют сравнение (
24 мар 11, 11:28    [10417489]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
-2-
Member

Откуда:
Сообщений: 15330
Vint
как обьяснить такой результат?)
max/min используют сравнение (nls_comp), а не сортировку (nls_sort)
24 мар 11, 11:28    [10417494]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Все еще не совсем понимаю:
1.создаёт окно - over()
2. ранжирует по сортировке (dense_rank last order by idn)
3. от max/min(idn) уже ничего не зависит.
ткните доку или где почитать для просветления)
24 мар 11, 11:55    [10417718]     Ответить | Цитировать Сообщить модератору
 Re  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Vint
3.

На твоем примере да.
24 мар 11, 11:57    [10417744]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
AmKad,

то есть keep сортирует в разделе (dense_rank last order by idn) по параметру nls_comp а over (order by .... сортирует по nls_sort? имхо нелогично.
24 мар 11, 12:01    [10417785]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
-2-
Member

Откуда:
Сообщений: 15330
Vint
имхо нелогично.
keep
DENSE_RANK FIRST or DENSE_RANK LAST indicates that Oracle Database will aggregate over only those rows with the minimum (FIRST) or the maximum (LAST) dense rank (also called olympic rank).

мое имхо - неоднознаное восприятие ключевой фразы order by в keep, но это решаемо:
with t as (
select '01' idn from dual union all
select '11' idn from dual union all
select '29' idn from dual union all
select '20' idn from dual union all
select 'A0' idn from dual union all
select 'AA' idn from dual
)
select t.*,row_number() over (order by idn), max(idn) keep(dense_rank last крайняк by idn) over()
, max(idn) over()
from t order by idn

IDN ROW_NUMBER()OVER(ORDERBYIDN) MAX(IDN)KEEP(DENSE_RANKLASTКРАЙНЯКBYIDN)OVER() MAX(IDN)OVER() 
--- ---------------------------- ---------------------------------------------- -------------- 
AA  1                            AA                                             29             
A0  2                            AA                                             29             
01  3                            AA                                             29             
11  4                            AA                                             29             
20  5                            AA                                             29             
29  6                            AA                                             29             

6 rows selected
Vint
имхо нелогично.
keep
DENSE_RANK FIRST or DENSE_RANK LAST indicates that Oracle Database will aggregate over only those rows with the minimum (FIRST) or the maximum (LAST) dense rank (also called olympic rank).

мое имхо - неоднознаное восприятие ключевой фразы order by в keep, но это решаемо:
with t as (
select '01' idn from dual union all
select '11' idn from dual union all
select '29' idn from dual union all
select '20' idn from dual union all
select 'A0' idn from dual union all
select 'AA' idn from dual
)
select t.*,row_number() over (order by idn), max(idn) keep(dense_rank last крайняк by idn) over()
, max(idn) over()
from t order by idn

IDN ROW_NUMBER()OVER(ORDERBYIDN) MAX(IDN)KEEP(DENSE_RANKLASTКРАЙНЯКBYIDN)OVER() MAX(IDN)OVER() 
--- ---------------------------- ---------------------------------------------- -------------- 
AA  1                            AA                                             29             
A0  2                            AA                                             29             
01  3                            AA                                             29             
11  4                            AA                                             29             
20  5                            AA                                             29             
29  6                            AA                                             29             

6 rows selected
24 мар 11, 13:41    [10418753]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
-2-,

повертев так и эдак, теперь понимаю что в принципе это не тот ордер бай..)
но имхо нелогичность всё таки присутствует.
задача была простая:
найти последний элемент дерева при определённой сортировке. вот и юзай потом групп бай и keep)))
24 мар 11, 13:54    [10418847]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
-2-
Member

Откуда:
Сообщений: 15330
Vint,

кряйняк by nlssort(idn)
24 мар 11, 14:04    [10418905]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
-2-
ну скорее first(idn) keep (max/min_rank idn,....)
24 мар 11, 14:09    [10418947]     Ответить | Цитировать Сообщить модератору
 хрен отправишь длинный пост  [new]
-2-
Member

Откуда:
Сообщений: 15330
NLSSORT позволяет приструнить даже keep dense_rank
24 мар 11, 14:35    [10419157]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
-2-
Если можно покажите на этом примере как(у меня не получилось...):
+
--alter session set nls_sort=RUSSIAN;
with t as (
select '01' idn from dual union all
select '11' idn from dual union all
select '29' idn from dual union all
select '20' idn from dual union all
select 'A0' idn from dual union all
select 'AA' idn from dual
)
select t.*,row_number() over (order by idn), max(idn) keep(dense_rank first order by idn) over(),
first_value(idn) over (order by idn rows between unbounded preceding and unbounded following),
min(idn) over (),
DENSE_RANK() over (order by idn)
from t order by idn
24 мар 11, 15:06    [10419391]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
-2-
Member

Откуда:
Сообщений: 15330
так:
max(idn) keep (dense_rank last ОРДЕР by nlssort(idn))
ОРДЕР должен совпадать ORDER
24 мар 11, 15:22    [10419552]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
-2-
Member

Откуда:
Сообщений: 15330
Похоже keep'овый ордер не соответствует даже min/max'овому nls_comp.
24 мар 11, 15:25    [10419587]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
-2-
Похоже keep'овый ордер не соответствует даже min/max'овому nls_comp.

похоже он всегда binary..
24 мар 11, 15:28    [10419607]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
-2-
и не только он еще и min(idn) over (), то биш есть какие странности имхо... и некоторая несообразность в такой разной сортировке.
24 мар 11, 15:28    [10419608]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 837
Есть еще много тонкостей.
Например при применении аналитики в модели в разеделе rules.
SQL> alter session set nls_sort=russian;
 
Session altered
SQL> with t0 as
  2  (select 'Ы' s from dual union all select '0' from dual union all select 'Y' from dual)
  3  select t.*, row_number() over (order by s) rn2
  4  from
  5  (select s, rn0, rn1
  6  from t0
  7  model
  8  dimension by (row_number() over (order by s) rn1)
  9  measures (s, 0 rn0)
 10  rules
 11  (rn0[any] = row_number() over(order by s))) t;
 
S        RN0        RN1        RN2
- ---------- ---------- ----------
Y          2          1          1
Ы          3          2          2
0          1          3          3
24 мар 11, 15:58    [10419820]     Ответить | Цитировать Сообщить модератору
 Re: keep+over+nls_lang = bag или фича?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Кобанчег,

эта тонкость в принципе туда же куда и сортировка в keep:
[img=
+
--alter session set nls_sort=RUSSIAN;
with t as (
select '01' idn from dual union all
select '11' idn from dual union all
select '29' idn from dual union all
select '20' idn from dual union all
select 'A0' idn from dual union all
select 'AA' idn from dual
)

   select t.*, row_number() over (order by idn) rn2
    from
    (select idn, rn0, rn1
    from t
    model
    dimension by (row_number() over (order by idn) rn1)
    measures (idn, 0 rn0)
   rules
   (rn0[any] = row_number() over(order by idn))) t
]
24 мар 11, 16:02    [10419854]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: keep+over+nls_lang = bag или фича?  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Vint,

11.2
ID ROW_NUMBER()OVER(ORDERBYIDN) MA
-- ---------------------------- --
01                            1 AA
11                            2 AA
20                            3 AA
29                            4 AA
A0                            5 AA
AA                            6 AA

ID ROW_NUMBER()OVER(ORDERBYIDN) MA
-- ---------------------------- --
AA                            1 AA
A0                            2 AA
01                            3 AA
11                            4 AA
20                            5 AA
29                            6 AA


12.1.0.2
ID ROW_NUMBER()OVER(ORDERBYIDN) MA
-- ---------------------------- --
01                            1 AA
11                            2 AA
20                            3 AA
29                            4 AA
A0                            5 AA
AA                            6 AA

ID ROW_NUMBER()OVER(ORDERBYIDN) MA
-- ---------------------------- --
AA                            1 29
A0                            2 29
01                            3 29
11                            4 29
20                            5 29
29                            6 29
4 июн 17, 14:53    [20537964]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить