Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Bug или предновогоднее настроение?  [new]
init.ora
Member

Откуда: гетто
Сообщений: 317
Не могу понять, это у меня что-то с головой или это баг?

select trunc(dt, 'dd') d, count(1) cnt
from(
  select trunc(dt, 'hh24') dt, count(1) cnt
  from(
    select sysdate + (level-1)/24 dt 
    from dual connect by level <=1500
  )z
  group by trunc(dt, 'hh24')
)z
group by trunc(dt, 'dd')


Почему не до суток идет группировка?
24 дек 15, 15:40    [18604967]     Ответить | Цитировать Сообщить модератору
 Re: Bug или предновогоднее настроение?  [new]
Vint
Member

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

стыдно должно быть. ни результата ни версии....
11.2.0.3 - полет нормальный.
24 дек 15, 15:44    [18604994]     Ответить | Цитировать Сообщить модератору
 Re: Bug или предновогоднее настроение?  [new]
init.ora
Member

Откуда: гетто
Сообщений: 317
Vint
init.ora,

стыдно должно быть. ни результата ни версии....
11.2.0.3 - полет нормальный.


Точно. думал же о том, что версию указать надо..
версия: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

Результат:
SQL> select trunc(dt, 'dd') d, count(1) cnt
  2  from(
  3    select trunc(dt, 'hh24') dt, count(1) cnt
  4    from(
  5      select sysdate + (level-1)/24 dt
  6      from dual connect by level <=50
  7    )z
  8    group by trunc(dt, 'hh24')
  9  )z
 10  group by trunc(dt, 'dd') order by 1
 11  /
D                  CNT
----------- ----------
24.12.2015           1
24.12.2015           1
24.12.2015           1
24.12.2015           1
24.12.2015           1
24.12.2015           1
24.12.2015           1
24.12.2015           1
24.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1 
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
25.12.2015           1
26.12.2015           1
26.12.2015           1
26.12.2015           1
26.12.2015           1
26.12.2015           1
26.12.2015           1
26.12.2015           1
26.12.2015           1 
26.12.2015           1
26.12.2015           1
26.12.2015           1
26.12.2015           1
26.12.2015           1
26.12.2015           1
26.12.2015           1
26.12.2015           1
26.12.2015           1
50 rows selected
24 дек 15, 15:52    [18605050]     Ответить | Цитировать Сообщить модератору
 Re: Bug или предновогоднее настроение?  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
init.ora,

Та же петрушка
+ воркэраунд не оригинален

Connected to Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 
SQL> 
SQL>  select trunc(dt, 'dd') d, count(1) cnt
  2   from
  3   (
  4     select trunc(dt, 'hh24') dt, count(1) cnt
  5     from(
  6       select sysdate + (level-1)/24 dt
  7       from dual connect by level <=50
  8     )z
  9     where rownum > 0
 10     group by trunc(dt, 'hh24')
 11   )z
 12   group by trunc(dt, 'dd') order by 1
 13  /
D                  CNT
----------- ----------
24.12.2015           8
25.12.2015          24
26.12.2015          18

24 дек 15, 16:10    [18605132]     Ответить | Цитировать Сообщить модератору
 Re: Bug или предновогоднее настроение?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
init.ora,

баг, имхо

если переписать с факторингом - тоже повторяется,
но хинта боится :)

12.1

with z as (select --+  materialize
    trunc(dt, 'hh24') dt, count(1) cnt
  from(
    select sysdate + (level-1)/24 dt 
    from dual connect by level <=1500
  )z
  group by trunc(dt, 'hh24')
) 
select trunc(dt ) d, count(*) cnt
from z
group by trunc(dt );
24 дек 15, 16:11    [18605141]     Ответить | Цитировать Сообщить модератору
 Re: Bug или предновогоднее настроение?  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
init.ora,

Таблетка:
+
SQL> select /*+ opt_param('_optimizer_aggr_groupby_elim' 'FALSE')*/
  2        trunc(dt, 'dd') d, count(1) cnt
  3  from(
  4    select trunc(dt, 'hh24') dt, count(1) cnt
  5    from(
  6      select sysdate + (level-1)/24 dt
  7      from dual connect by level <=1500
  8    )z
  9    group by trunc(dt, 'hh24')
 10  )z
 11  group by trunc(dt, 'dd');

D                CNT
--------- ----------
09-JAN-16         24
20-JAN-16         24
25-JAN-16         24
04-FEB-16         24
15-FEB-16         24
28-DEC-15         24
12-JAN-16         24
22-JAN-16         24
31-JAN-16         24
05-FEB-16         24
12-FEB-16         24

D                CNT
--------- ----------
17-FEB-16         24
21-FEB-16         24
25-FEB-16          8
27-DEC-15         24
24-JAN-16         24
27-JAN-16         24
02-FEB-16         24
08-FEB-16         24
11-FEB-16         24
16-FEB-16         24
19-FEB-16         24

D                CNT
--------- ----------
19-JAN-16         24
03-FEB-16         24
07-FEB-16         24
20-FEB-16         24
24-FEB-16         24
30-DEC-15         24
31-DEC-15         24
05-JAN-16         24
06-JAN-16         24
10-JAN-16         24
17-JAN-16         24

D                CNT
--------- ----------
29-JAN-16         24
10-FEB-16         24
26-DEC-15         24
01-JAN-16         24
03-JAN-16         24
08-JAN-16         24
13-JAN-16         24
30-JAN-16         24
06-FEB-16         24
13-FEB-16         24
18-FEB-16         24

D                CNT
--------- ----------
22-FEB-16         24
24-DEC-15          4
25-DEC-15         24
02-JAN-16         24
11-JAN-16         24
14-JAN-16         24
16-JAN-16         24
21-JAN-16         24
23-JAN-16         24
23-FEB-16         24
29-DEC-15         24

D                CNT
--------- ----------
04-JAN-16         24
07-JAN-16         24
15-JAN-16         24
18-JAN-16         24
26-JAN-16         24
28-JAN-16         24
01-FEB-16         24
09-FEB-16         24
14-FEB-16         24

64 rows selected.

Предположительно, Bug 20537092 : WRONG RESULT FOR NESTED QUERY GROUP BY
Есть патч для Linux x86-64
24 дек 15, 17:04    [18605388]     Ответить | Цитировать Сообщить модератору
 Re: Bug или предновогоднее настроение?  [new]
dba123
Member

Откуда:
Сообщений: 1054
init.ora,

На мой взгляд, этот запрос работает согласно документации
select dt, count(*) cnt
from(
select trunc(dt) dt,extract(hour from cast(dt as timestamp))
  from(
    select sysdate + (level-1)/24 dt 
    from dual connect by level <=1500
  )
)
group by dt;


http://docs.oracle.com/database/121/SQLRF/functions067.htm#SQLRF00639
EXTRACT extracts and returns the value of a specified datetime field from a datetime or interval expression. The expr can be any expression that evaluates to a datetime or interval data type compatible with the requested field:

-If YEAR or MONTH is requested, then expr must evaluate to an expression of data type DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, or INTERVAL YEAR TO MONTH.

-If DAY is requested, then expr must evaluate to an expression of data type DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, or INTERVAL DAY TO SECOND.

-If HOUR, MINUTE, or SECOND is requested, then expr must evaluate to an expression of data type TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, or INTERVAL DAY TO SECOND. DATE is not valid here, because Oracle Database treats it as ANSI DATE data type, which has no time fields.

-If TIMEZONE_HOUR, TIMEZONE_MINUTE, TIMEZONE_ABBR, TIMEZONE_REGION, or TIMEZONE_OFFSET is requested, then expr must evaluate to an expression of data type TIMESTAMP WITH TIME ZONE or TIMESTAMP WITH LOCAL TIME ZONE.

EXTRACT interprets expr as an ANSI datetime data type. For example, EXTRACT treats DATE not as legacy Oracle DATE but as ANSI DATE, without time elements. Therefore, you can extract only YEAR, MONTH, and DAY from a DATE value. Likewise, you can extract TIMEZONE_HOUR and TIMEZONE_MINUTE only from the TIMESTAMP WITH TIME ZONE data type.

25 дек 15, 09:33    [18607784]     Ответить | Цитировать Сообщить модератору
 Re: Bug или предновогоднее настроение?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
dba123
init.ora,

На мой взгляд, этот запрос работает согласно документации
select dt, count(*) cnt
from(
select trunc(dt) dt,extract(hour from cast(dt as timestamp))
  from(
    select sysdate + (level-1)/24 dt 
    from dual connect by level <=1500
  )
)
group by dt;


да,
это другой запрос (и здесь тот баг не стреляет)
25 дек 15, 10:57    [18608163]     Ответить | Цитировать Сообщить модератору
 Re: Bug или предновогоднее настроение?  [new]
init.ora
Member

Откуда: гетто
Сообщений: 317
SeaGate
init.ora,

Таблетка:
+
SQL> select /*+ opt_param('_optimizer_aggr_groupby_elim' 'FALSE')*/
  2        trunc(dt, 'dd') d, count(1) cnt
  3  from(
  4    select trunc(dt, 'hh24') dt, count(1) cnt
  5    from(
  6      select sysdate + (level-1)/24 dt
  7      from dual connect by level <=1500
  8    )z
  9    group by trunc(dt, 'hh24')
 10  )z
 11  group by trunc(dt, 'dd');

D                CNT
--------- ----------
09-JAN-16         24
20-JAN-16         24
25-JAN-16         24
04-FEB-16         24
15-FEB-16         24
28-DEC-15         24
12-JAN-16         24
22-JAN-16         24
31-JAN-16         24
05-FEB-16         24
12-FEB-16         24

D                CNT
--------- ----------
17-FEB-16         24
21-FEB-16         24
25-FEB-16          8
27-DEC-15         24
24-JAN-16         24
27-JAN-16         24
02-FEB-16         24
08-FEB-16         24
11-FEB-16         24
16-FEB-16         24
19-FEB-16         24

D                CNT
--------- ----------
19-JAN-16         24
03-FEB-16         24
07-FEB-16         24
20-FEB-16         24
24-FEB-16         24
30-DEC-15         24
31-DEC-15         24
05-JAN-16         24
06-JAN-16         24
10-JAN-16         24
17-JAN-16         24

D                CNT
--------- ----------
29-JAN-16         24
10-FEB-16         24
26-DEC-15         24
01-JAN-16         24
03-JAN-16         24
08-JAN-16         24
13-JAN-16         24
30-JAN-16         24
06-FEB-16         24
13-FEB-16         24
18-FEB-16         24

D                CNT
--------- ----------
22-FEB-16         24
24-DEC-15          4
25-DEC-15         24
02-JAN-16         24
11-JAN-16         24
14-JAN-16         24
16-JAN-16         24
21-JAN-16         24
23-JAN-16         24
23-FEB-16         24
29-DEC-15         24

D                CNT
--------- ----------
04-JAN-16         24
07-JAN-16         24
15-JAN-16         24
18-JAN-16         24
26-JAN-16         24
28-JAN-16         24
01-FEB-16         24
09-FEB-16         24
14-FEB-16         24

64 rows selected.

Предположительно, Bug 20537092 : WRONG RESULT FOR NESTED QUERY GROUP BY
Есть патч для Linux x86-64


Вот еще одна:

select /*+ no_elim_groupby */
      trunc(dt, 'dd') d, count(1) cnt
from(
  select trunc(dt, 'hh24') dt, count(1) cnt
  from(
    select sysdate + (level-1)/24 dt
    from dual connect by level <=1500
  )z
  group by trunc(dt, 'hh24')
)z
group by trunc(dt, 'dd');


У Льюиса описана подобная ситуация:
https://jonathanlewis.wordpress.com/2014/09/04/group-by-bug/


dba123
автор
init.ora,
На мой взгляд, этот запрос работает согласно документации

Только это совсем из другой оперы :)
25 дек 15, 11:39    [18608424]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить