powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / keep+over+nls_lang = bag или фича?
22 сообщений из 22, страница 1 из 1
keep+over+nls_lang = bag или фича?
    #37180577
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
стандратные настройки базы nls_language = 'AMERICAN'
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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


Код: plaintext
1.
alter session set nls_language = 'RUSSIAN'
и еще раз запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37180594
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понятнее было бы вместо row_number() подставить
Код: plaintext
LAST_value(idn) over (order by idn rows between unbounded preceding and unbounded following)
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37180602
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
keep работает внутри группы max- или min- значений.
Код: plaintext
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.
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             

...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37180614
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мда.. надо было сразу писать с first_value пример))
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
--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
Код: plaintext
1.
2.
3.
4.
5.
6.
	AA	 1 	 01 	AA
	A0	 2 	 01 	AA
	 01 	 3 	 01 	AA
	 11 	 4 	 01 	AA
	 20 	 5 	 01 	AA
	 29 	 6 	 01 	AA

как обьяснить такой результат?)
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37180626
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vintкак обьяснить такой результат?)max/min используют сравнение (
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37180629
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vintкак обьяснить такой результат?)max/min используют сравнение (nls_comp), а не сортировку (nls_sort)
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37180704
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все еще не совсем понимаю:
1.создаёт окно - over()
2. ранжирует по сортировке (dense_rank last order by idn)
3. от max/min(idn) уже ничего не зависит.
ткните доку или где почитать для просветления)
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37180715
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vint3.
На твоем примере да.
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37180728
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

то есть keep сортирует в разделе (dense_rank last order by idn) по параметру nls_comp а over (order by .... сортирует по nls_sort? имхо нелогично.
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37180933
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vintимхо нелогично.keepDENSE_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, но это решаемо:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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имхо нелогично.keepDENSE_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, но это решаемо:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37180963
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

повертев так и эдак, теперь понимаю что в принципе это не тот ордер бай..)
но имхо нелогичность всё таки присутствует.
задача была простая:
найти последний элемент дерева при определённой сортировке. вот и юзай потом групп бай и keep)))
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37180978
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vint,

кряйняк by nlssort(idn)
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37180991
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-
ну скорее first(idn) keep (max/min_rank idn,....)
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37181054
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NLSSORT позволяет приструнить даже keep dense_rank
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37181114
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-
Если можно покажите на этом примере как(у меня не получилось...):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
--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
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37181148
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так:
max(idn) keep (dense_rank last ОРДЕР by nlssort(idn))
ОРДЕР должен совпадать ORDER
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37181158
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже keep'овый ордер не соответствует даже min/max'овому nls_comp.
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37181165
bdsm_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Похоже keep'овый ордер не соответствует даже min/max'овому nls_comp.
похоже он всегда binary..
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37181166
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-
и не только он еще и min(idn) over (), то биш есть какие странности имхо... и некоторая несообразность в такой разной сортировке.
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37181238
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще много тонкостей.
Например при применении аналитики в модели в разеделе rules.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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 
...
Рейтинг: 0 / 0
keep+over+nls_lang = bag или фича?
    #37181253
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег,

эта тонкость в принципе туда же куда и сортировка в keep:
[img=
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
--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
]
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
keep+over+nls_lang = bag или фича?
    #39465472
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vint,

11.2
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / keep+over+nls_lang = bag или фича?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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