Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 last_value странный результат  [new]
Maxifly
Member

Откуда:
Сообщений: 513
Не понимаю, почему last_value дает такой результат:


SQL> select t.rowid, t.asua_id, t.del_date,
2 first_value(t.rowid) over(order by del_date ASC NULLS FIRST) fr,
3 last_value(t.rowid) over(order by del_date ASC NULLS FIRST) lr
4 from AS_USER_ATTRIBUTES t
5 order by t.rowid;
ROWID ASUA_ID DEL_DATE FR LR
------------------- -------------------- ----------- ------------------ --------------------
AAAFmoAAFAAAAH8AAA 100100000000001 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAJ
AAAFmoAAFAAAAH8AAB 100100000000002 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAJ
AAAFmoAAFAAAAH8AAC 100100000000003 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAJ
AAAFmoAAFAAAAH8AAD 100100000000004 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAJ
AAAFmoAAFAAAAH8AAE 100100000000005 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAJ
AAAFmoAAFAAAAH8AAF 100100000000006 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAJ
AAAFmoAAFAAAAH/AAA 100100000000007 04.10.2018 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAA
AAAFmoAAFAAAAH/AAB 100100000000008 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAJ
AAAFmoAAFAAAAH/AAC 100100000000009 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAJ
AAAFmoAAFAAAAH/AAD 100100000000010 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAJ
AAAFmoAAFAAAAH/AAE 100100000000011 06.10.2018 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAE
AAAFmoAAFAAAAH/AAF 100100000000012 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAJ
AAAFmoAAFAAAAH/AAG 100100000000013 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAJ
AAAFmoAAFAAAAH/AAH 100100000000014 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAJ
AAAFmoAAFAAAAH/AAI 100100000000015 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAJ
AAAFmoAAFAAAAH/AAJ 100100000000016 AAAFmoAAFAAAAH8AAA AAAFmoAAFAAAAH/AAJ
16 rows selected


Группа одна. Сортируется по del_date. Значит last_value должна вернуть rowid соответсвующий записи с del_date 06.10.2018. То есть AAAFmoAAFAAAAH/AAE.

А результата - три разных. Как будто есть три группы.

Правильный ответ будет тиолько если я явно указываю безразмерное окно:

last_value(t.rowid) over(order by del_date ASC NULLS FIRST ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)

Не понимаю, почему так.


Люблю галеры - работящий коллектив, романтика мужского труда. Стоишь на мостике в пене брызг и эдак поворотясь:
- Голубчик! Утроить количество ударов - Али-паша уходит...
4 окт 18, 18:17    [21695623]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16771
Maxifly
Группа одна. Сортируется по del_date. Значит last_value должна вернуть rowid соответсвующий записи с del_date 06.10.2018. То есть AAAFmoAAFAAAAH/AAE.

А результата - три разных. Как будто есть три группы.

Это потому что кое-кто не понимает, какие умолчания действуют для сортированных окон.
Что у нас по синтаксису пишется после order by?
Отож :)
4 окт 18, 18:23    [21695635]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
Maxifly
Member

Откуда:
Сообщений: 513
andrey_anonymous,
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
А я-то думал безразмерный по умолчанию.

Блин, век живи - век учись.
4 окт 18, 18:33    [21695648]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16771
Maxifly
А я-то думал безразмерный по умолчанию.

Без order by - "безразмерный".
4 окт 18, 18:35    [21695651]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
Maxifly
andrey_anonymous,
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
А я-то думал безразмерный по умолчанию.

Блин, век живи - век учись.

Вы уверены что по умолчанию такое окно?

імхо
ето не так

.....
stax
5 окт 18, 08:58    [21695975]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
AmKad
Member

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

Да, range.
5 окт 18, 09:55    [21696034]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
SkilledJunior
Member

Откуда:
Сообщений: 113
LAST_VALUE

автор
If you omit the windowing_clause of the analytic_clause, it defaults to RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. This default sometimes returns an unexpected value, because the last value in the window is at the bottom of the window, which is not fixed. It keeps changing as the current row changes. For expected results, specify the windowing_clause as RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING. Alternatively, you can specify the windowing_clause as RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING.


имхо не совсем правильное поведение, по умолчанию должно было бы быть без ограничений, хочешь ограничить указывай как, но что выросло то выросло.
5 окт 18, 14:48    [21696440]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16771
SkilledJunior
имхо не совсем правильное поведение

Еще один воинствующий?
Предлагаю поискать систему:
SQL> with t as (select rownum r from dual connect by level < 10)
  2  select max(r) over()
  3       , max(r) over(order by r)
  4       , sum(r) over()
  5       , sum(r) over(order by r)
  6       , last_value(r) over()
  7       , last_value(r) over(order by r)
  8    from t
  9  ;
MAX(R)OVER() MAX(R)OVER(ORDERBYR) SUM(R)OVER() SUM(R)OVER(ORDERBYR) LAST_VALUE(R)OVER() LAST_VALUE(R)OVER(ORDERBYR)
------------ -------------------- ------------ -------------------- ------------------- ---------------------------
           9                    1           45                    1                   9                           1
           9                    2           45                    3                   9                           2
           9                    3           45                    6                   9                           3
           9                    4           45                   10                   9                           4
           9                    5           45                   15                   9                           5
           9                    6           45                   21                   9                           6
           9                    7           45                   28                   9                           7
           9                    8           45                   36                   9                           8
           9                    9           45                   45                   9                           9
9 rows selected

SQL> 
5 окт 18, 14:58    [21696448]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
andrey_anonymous,

лично мне более удобно если БЫ по умолчанию было ROWS

.....
stax
5 окт 18, 15:22    [21696484]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28275
SkilledJunior
имхо не совсем правильное поведение, по умолчанию должно было бы быть без ограничений, хочешь ограничить указывай как,


К сообщению приложен файл. Размер - 42Kb
5 окт 18, 15:26    [21696494]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
SkilledJunior
Member

Откуда:
Сообщений: 113
andrey_anonymous
SkilledJunior
имхо не совсем правильное поведение

Еще один воинствующий?
Предлагаю поискать систему:
SQL> with t as (select rownum r from dual connect by level < 10)
  2  select max(r) over()
  3       , max(r) over(order by r)
  4       , sum(r) over()
  5       , sum(r) over(order by r)
  6       , last_value(r) over()
  7       , last_value(r) over(order by r)
  8    from t
  9  ;
MAX(R)OVER() MAX(R)OVER(ORDERBYR) SUM(R)OVER() SUM(R)OVER(ORDERBYR) LAST_VALUE(R)OVER() LAST_VALUE(R)OVER(ORDERBYR)
------------ -------------------- ------------ -------------------- ------------------- ---------------------------
           9                    1           45                    1                   9                           1
           9                    2           45                    3                   9                           2
           9                    3           45                    6                   9                           3
           9                    4           45                   10                   9                           4
           9                    5           45                   15                   9                           5
           9                    6           45                   21                   9                           6
           9                    7           45                   28                   9                           7
           9                    8           45                   36                   9                           8
           9                    9           45                   45                   9                           9
9 rows selected

SQL> 

Почему сразу воинствующий?

Например, max(r) over() и max(r) over(order by r), ты можешь объяснить почему максимальное значение должно зависеть от сортировки?
5 окт 18, 16:20    [21696574]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28275
SkilledJunior
Почему сразу воинствующий?
Потому что не читает документацию.
5 окт 18, 16:30    [21696588]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5142
SkilledJunior
почему максимальное значение должно зависеть от сортировки?
Возможно, пригодится пример из моей книги.
Подраздел "Differences and interchangeability of functions", страница 49.
5 окт 18, 16:34    [21696590]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
SkilledJunior
Например, max(r) over() и max(r) over(order by r), ты можешь объяснить почему максимальное значение должно зависеть от сортировки?

максимальное значение зависит от окна
окно разное для over() и over(order by r)

.....
stax
5 окт 18, 16:34    [21696591]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
SkilledJunior
Member

Откуда:
Сообщений: 113
dbms_photoshop,
Добавил в избранное, ознакомлюсь попозже, спасибо.

Stax,
Вопрос как раз в том, почему разное, я не задавал ограничения окна в явном виде, оно наложено по умолчанию потому что так посчитали нужным разработчики, имхо это не совсем верно.

Elic
Потому что не читает документацию.

В документации "что выросло, то выросло", а могло бы быть и по другому, ИМХО по другому было бы логичнее, но это мое ИМХО.
5 окт 18, 16:51    [21696615]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
-2-
Member

Откуда:
Сообщений: 13826
Stax
лично мне более удобно если БЫ по умолчанию было ROWS
добавляй в order by уникальное значение, хотя бы rownum, и будет тебе "rows".
5 окт 18, 16:52    [21696618]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28275
SkilledJunior
В документации "что выросло, то выросло", а могло бы быть и по другому, ИМХО по другому было бы логичнее, но это мое ИМХО.
Ага, злые дяди, писавшие стандарт, забыли спросить у шкета на горшке, как ему будет потом логичнее.
5 окт 18, 16:58    [21696625]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
SkilledJunior
Member

Откуда:
Сообщений: 113
Elic
Ага, злые дяди, писавшие стандарт, забыли спросить у шкета на горшке, как ему будет потом логичнее.

Ну да, прямо боги с небес спустились горшки обжигать стандарт писать))

Stax
лично мне более удобно если БЫ по умолчанию было ROWS

Согласен.

andrey_anonymous
Предлагаю поискать систему:

RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW (по умолчанию), не имеет смысла:
max(r) over(order by r)
last_value(r) over(order by r)
и в том и другом случае они просто равны r

не имеет смысла order by:
max(r) over(order by r RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
sum(r) over(order by r RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)

last_value(r) over() - вообще непредсказуемый результат.
6 окт 18, 01:41    [21696896]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9112
SkilledJunior
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW (по умолчанию), не имеет смысла:
max(r) over(order by r)
last_value(r) over(order by r)
и в том и другом случае они просто равны r


Да ну? Шел бы ты учить матчасть:

with t as (select 'A' r from dual union all select null from dual)
select  row_number() over(order by r) rn,
        r,
        max(r) over(order by r) max_r,
        last_value(r) over(order by r) last_r
  from  t
/

        RN R MAX_R LAST_R
---------- - ----- ------
         1 A A     A
         2   A

SQL> 


SkilledJunior
last_value(r) over() - вообще непредсказуемый результат.


С точностью до наоборот. last_value(r) over() всегда вернет последнее в порядке возрастания значение r среди всех выбранных значений r.

SY.
6 окт 18, 04:35    [21696902]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28275
SkilledJunior
last_value(r) over() - вообще непредсказуемый результат.
Воинствующий ламер.
6 окт 18, 08:23    [21696914]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
-2-
Member

Откуда:
Сообщений: 13826
SkilledJunior
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW (по умолчанию), не имеет смысла
как раз открытая задняя граница в макс не имеет смысла так как совпадает с вообще без указания ордер бы. Причем даже в случае разных выражений макс-значения и сортировки.

SkilledJunior
last_value(r) over() - вообще непредсказуемый результат.
Where rownum без сортировки в подзапросе. Кто-то заставляет полагаться на порядок без указания ордер бы?
6 окт 18, 10:44    [21696950]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
SkilledJunior
Member

Откуда:
Сообщений: 113
-2-,

Речь о том, что параметров по умолчанию для любых случаев нет, результат работы аналитических функций в определенных условиях теряет смысл и эти условия для разных функций разные.
6 окт 18, 14:00    [21696998]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
SkilledJunior
Member

Откуда:
Сообщений: 113
-2-
Where rownum без сортировки в подзапросе. Кто-то заставляет полагаться на порядок без указания ордер бы?

Не очень понял при чем здесь rownum, вроде про аналитические функции ведем разговор, для last_value сортировка в подзапросе ничего не гарантирует.

SY
Да ну? Шел бы ты учить матчасть

Мы рассматривали вариант с суррогатным первичным ключом для строки выборки, а он вроде как not null, в противном случае ситуация поправима))

last_value(r IGNORE NULLS) over(order by r) last_r


SY
С точностью до наоборот. last_value(r) over() всегда вернет последнее в порядке возрастания значение r среди всех выбранных значений r.


Elic
SkilledJunior
last_value(r) over() - вообще непредсказуемый результат.
Воинствующий ламер.


Ребята, позвольте с вами не согласиться, помедитируйте на досуге:
with
t (id, r, dt, part) as
(
select 1, 10, date '2015-07-01', 1 from dual union all
select 2, 3,  date '2015-08-01', 1 from dual union all
select 3, 2,  date '2015-09-01', 1 from dual union all
select 4, 0,  date '2016-11-01', 1 from dual union all
select 5, 5,  date '2016-11-01', 1 from dual union all
select 6, 9,  date '2017-01-01', 1 from dual union all
select 7, 4,  date '2017-01-01', 1 from dual
)


4
select r
, last_value(r) over() last_r
from t


10
select r
, last_value(r) over() last_r
from (select * from t order by r)


10
select r
, last_value(r) over() last_r
, max(r) over(order by r) max_r
from t


0
select r
, last_value(r) over() last_r
, max(r) over(order by r DESC) max_r
from (select * from t order by r)
6 окт 18, 14:30    [21697010]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
-2-
Member

Откуда:
Сообщений: 13826
SkilledJunior
параметров по умолчанию для любых случаев нет
дефолтные параметры есть.
Ламеризм побуждает тебя искать несуществующие изъяны. Просмотрел последние десять тем с применением last_value. Только в одной используется unbounded following.
Одинаковые дефолты не только позволяют применять пользовательские и десятки стандартных функций без оглядки в документацию на вариативность, но и оберегают ленивых джуниоров от лишних умолчательных пересортировок.
6 окт 18, 14:41    [21697016]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
SkilledJunior
Member

Откуда:
Сообщений: 113
-2-
Одинаковые дефолты не только позволяют применять пользовательские и десятки стандартных функций без оглядки в документацию на вариативность

Это не так и ТС тому пример.
6 окт 18, 14:47    [21697019]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
-2-
Member

Откуда:
Сообщений: 13826
SkilledJunior
-2-
Одинаковые дефолты не только позволяют применять пользовательские и десятки стандартных функций без оглядки в документацию на вариативность
Это не так и ТС тому пример.
В русском языке правильно употреблятствовать "без оглядки НА ...". "в документацию" второстепенное уточнение.
6 окт 18, 15:56    [21697033]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
SkilledJunior
Member

Откуда:
Сообщений: 113
-2-
В русском языке правильно употреблятствовать "без оглядки НА ...". "в документацию" второстепенное уточнение.

В русском языке нет такой корявой конструкции как "без оглядки в ... на ...", но это не важно, ибо форум не посвящен чистоте русского языка.

По смысловой нагрузке тоже ничего радикально не меняется, если бы вы были правы эта тема не появилась бы.
7 окт 18, 23:27    [21697587]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28275
SkilledJunior
По смысловой нагрузке тоже ничего радикально не меняется, если бы вы были правы эта тема не появилась бы.
Ламерьё всегда прикрывает некой "логикой" неспособность к вдумчивому прочтению документации.
8 окт 18, 07:42    [21697670]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
SkilledJunior
Member

Откуда:
Сообщений: 113
Elic
Ламерьё всегда прикрывает некой "логикой" неспособность к вдумчивому прочтению документации.


Ты сам на грабли наступил 21697010, это означает твою неспособность вдумчиво читать документацию?
8 окт 18, 11:31    [21697839]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28275
SkilledJunior
Ты сам на грабли наступил 21697010, это означает твою неспособность вдумчиво читать документацию?
Перестань бредить.
8 окт 18, 11:35    [21697845]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
-2-
Stax
лично мне более удобно если БЫ по умолчанию было ROWS
добавляй в order by уникальное значение, хотя бы rownum, и будет тебе "rows".

результат совпадет с ROWS
но, насколько я себе представляю ранже алгоритм более сложен
поетому, когда не ленился явно прописывал окно из-за ROWS

ps
повторюсь, мне бы удобнее было чтоб по умолчанию был ROWS,
и не надо было б добавлять rownum/rowid и тд

....
stax
8 окт 18, 13:10    [21697984]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28275
Stax
и не надо было б добавлять rownum/rowid и тд
А мне удобней обеспечивать детерминированную сортировку.
8 окт 18, 13:50    [21698059]     Ответить | Цитировать Сообщить модератору
 Re: last_value странный результат  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
Elic
Stax
и не надо было б добавлять rownum/rowid и тд
А мне удобней обеспечивать детерминированную сортировку.

не вопрос

імхо
нужно больше ресерсов
1) сложнее алгоритм
2) больше ключ сортировки

.....
stax
8 окт 18, 14:11    [21698104]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Oracle Ответить