Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / keep+over+nls_lang = bag или фича? / 22 сообщений из 22, страница 1 из 1
24.03.2011, 11:02
    #37180577
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
стандратные настройки базы 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
24.03.2011, 11:10
    #37180594
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
понятнее было бы вместо row_number() подставить
Код: plaintext
LAST_value(idn) over (order by idn rows between unbounded preceding and unbounded following)
...
Рейтинг: 0 / 0
24.03.2011, 11:14
    #37180602
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
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
24.03.2011, 11:18
    #37180614
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
мда.. надо было сразу писать с 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
24.03.2011, 11:28
    #37180626
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
Vintкак обьяснить такой результат?)max/min используют сравнение (
...
Рейтинг: 0 / 0
24.03.2011, 11:28
    #37180629
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
Vintкак обьяснить такой результат?)max/min используют сравнение (nls_comp), а не сортировку (nls_sort)
...
Рейтинг: 0 / 0
24.03.2011, 11:55
    #37180704
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
Все еще не совсем понимаю:
1.создаёт окно - over()
2. ранжирует по сортировке (dense_rank last order by idn)
3. от max/min(idn) уже ничего не зависит.
ткните доку или где почитать для просветления)
...
Рейтинг: 0 / 0
24.03.2011, 11:57
    #37180715
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
Vint3.
На твоем примере да.
...
Рейтинг: 0 / 0
24.03.2011, 12:01
    #37180728
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
AmKad,

то есть keep сортирует в разделе (dense_rank last order by idn) по параметру nls_comp а over (order by .... сортирует по nls_sort? имхо нелогично.
...
Рейтинг: 0 / 0
24.03.2011, 13:41
    #37180933
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
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
24.03.2011, 13:54
    #37180963
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
-2-,

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

кряйняк by nlssort(idn)
...
Рейтинг: 0 / 0
24.03.2011, 14:09
    #37180991
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
-2-
ну скорее first(idn) keep (max/min_rank idn,....)
...
Рейтинг: 0 / 0
24.03.2011, 14:35
    #37181054
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
NLSSORT позволяет приструнить даже keep dense_rank
...
Рейтинг: 0 / 0
24.03.2011, 15:06
    #37181114
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
-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
24.03.2011, 15:22
    #37181148
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
так:
max(idn) keep (dense_rank last ОРДЕР by nlssort(idn))
ОРДЕР должен совпадать ORDER
...
Рейтинг: 0 / 0
24.03.2011, 15:25
    #37181158
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
Похоже keep'овый ордер не соответствует даже min/max'овому nls_comp.
...
Рейтинг: 0 / 0
24.03.2011, 15:28
    #37181165
bdsm_sql
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
-2-Похоже keep'овый ордер не соответствует даже min/max'овому nls_comp.
похоже он всегда binary..
...
Рейтинг: 0 / 0
24.03.2011, 15:28
    #37181166
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
-2-
и не только он еще и min(idn) over (), то биш есть какие странности имхо... и некоторая несообразность в такой разной сортировке.
...
Рейтинг: 0 / 0
24.03.2011, 15:58
    #37181238
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
Есть еще много тонкостей.
Например при применении аналитики в модели в разеделе 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
24.03.2011, 16:02
    #37181253
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
Кобанчег,

эта тонкость в принципе туда же куда и сортировка в 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
Период между сообщениями больше года.
04.06.2017, 14:53
    #39465472
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
keep+over+nls_lang = bag или фича?
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / keep+over+nls_lang = bag или фича? / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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