ORACLE SQL GROUP BY

и задачки для интервью.
DanielM
Уже с Приветом
Posts: 1222
Joined: 13 Dec 2001 10:01
Location: Louisville, KY

ORACLE SQL GROUP BY

Post by DanielM »

У меня есть таблица Call в Оракле 8и. В ней записаны времена и продолжительность телефонных звонков. Надо создать View который бы показывал количество звонков в течении каждого получасового интервала. Короче надо сделать Group By statement который каждые полчаса изменял свое значение.

Есть какие нибудь идеи как это сделать без написание stored procedures?
KPAH
Уже с Приветом
Posts: 456
Joined: 14 Feb 2002 10:01
Location: USA

ORACLE SQL GROUP BY

Post by KPAH »

</font><blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr /><font size="2" face="Arial, Verdana, Helvetica, sans-serif">Originally posted by DanielM:
<strong>У меня есть таблица Call в Оракле 8и. В ней записаны времена и продолжительность телефонных звонков. Надо создать View который бы показывал количество звонков в течении каждого получасового интервала. Короче надо сделать Group By statement который каждые полчаса изменял свое значение.

Есть какие нибудь идеи как это сделать без написание stored procedures?</strong></font><hr /></blockquote><font size="2" face="Arial, Verdana, Helvetica, sans-serif">надеюсь Ваша версия разрешает CAse иначе DECODE(имейте в виду, что в 8I PL/SQL CASE не понимает).
Идея следующая:
Select sum(Case (When to_number(to_char(date_column,'hh24mi')) between 0 and 29) Then 1 ) first_half_of_an_hour, etc.....
Т.е., если Вам нужно 48 columns, то, меняя WHEN, Вы это дело 48 раз повторяете hard-codom.
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

ORACLE SQL GROUP BY

Post by tengiz »

...GROUP BY TRUNC (callTime, 'HH'), EXTRACT (MINUTE FROM callTime) / 30
KPAH
Уже с Приветом
Posts: 456
Joined: 14 Feb 2002 10:01
Location: USA

ORACLE SQL GROUP BY

Post by KPAH »

</font><blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr /><font size="2" face="Arial, Verdana, Helvetica, sans-serif">Originally posted by tengiz:
<strong>...GROUP BY TRUNC (callTime, 'HH'), EXTRACT (MINUTE FROM callTime) / 30</strong></font><hr /></blockquote><font size="2" face="Arial, Verdana, Helvetica, sans-serif">Никогда не встречал этой function, и в документации ничего не могу найти. Попытка воспроизвести на какой-то date column даёт вот это:
SQL> select hiredate, count(*)
2 from emp
3 group by TRUNC (hiredate, 'HH'), EXTRACT (MINUTE FROM hiredate) / 30;
group by TRUNC (hiredate, 'HH'), EXTRACT (MINUTE FROM hiredate) / 30
*
ERROR at line 3:
ORA-30076: invalid extract field for extract source

Можно чуть подробнее?
Спасибо
KPAH
Уже с Приветом
Posts: 456
Joined: 14 Feb 2002 10:01
Location: USA

ORACLE SQL GROUP BY

Post by KPAH »

</font><blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr /><font size="2" face="Arial, Verdana, Helvetica, sans-serif">Originally posted by tengiz:
<strong>...GROUP BY TRUNC (callTime, 'HH'), EXTRACT (MINUTE FROM callTime) / 30</strong></font><hr /></blockquote><font size="2" face="Arial, Verdana, Helvetica, sans-serif">ОК, в 9-ом я нашел, но тут, вроде, 8-м интересуются...
Bilbo
Уже с Приветом
Posts: 135
Joined: 14 Sep 1999 09:01
Location: Toronto, Canada

ORACLE SQL GROUP BY

Post by Bilbo »

Это можно, но только это будет full table scan в связи с применением функций на дату. Подумайте, оно вам надо? Может, лучше старый добрый pl/sql,а?
Ведь call tables обычно огромные...

предлагаю что-то типа (возможны и др.варианты)

group by to_char(timestamp,'mmddhh24'),
decode( mod(to_number(to_char(timestamp,'MI')), 30),0,'0-30 min','31-60 min')

то есть, берем минуты из даты, делим на 30, берем остаток, если 0, то первая половина часа, если 1 - то вторая.
Криво, зато выберет.
Bilbo
Уже с Приветом
Posts: 135
Joined: 14 Sep 1999 09:01
Location: Toronto, Canada

ORACLE SQL GROUP BY

Post by Bilbo »

... Да, надеюсь на память, что вроде decode in Oracle8i are allowed in the group by clause. можно и без decode конечно.
Удачи!

Return to “Головоломки”