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

Откуда: Москва
Сообщений: 16916
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

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

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

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

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

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

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

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

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

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

Откуда:
Сообщений: 295
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

Откуда: Москва
Сообщений: 16916
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
Сообщений: 1421
andrey_anonymous,

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

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

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


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

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

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

Откуда: Ukraine,Lviv
Сообщений: 1421
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

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

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

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

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

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

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

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

Откуда:
Сообщений: 14118
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

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

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

Откуда:
Сообщений: 295
-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

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

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

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