У меня есть таблица Call в Оракле 8и. В ней записаны времена и продолжительность телефонных звонков. Надо создать View который бы показывал количество звонков в течении каждого получасового интервала. Короче надо сделать Group By statement который каждые полчаса изменял свое значение.
Есть какие нибудь идеи как это сделать без написание stored procedures?
ORACLE SQL GROUP BY
-
- Уже с Приветом
- Posts: 1222
- Joined: 13 Dec 2001 10:01
- Location: Louisville, KY
-
- Уже с Приветом
- Posts: 456
- Joined: 14 Feb 2002 10:01
- Location: USA
ORACLE SQL GROUP BY
</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.
<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.
-
- Уже с Приветом
- Posts: 4468
- Joined: 21 Sep 2000 09:01
- Location: Sammamish, WA
ORACLE SQL GROUP BY
...GROUP BY TRUNC (callTime, 'HH'), EXTRACT (MINUTE FROM callTime) / 30
-
- Уже с Приветом
- Posts: 456
- Joined: 14 Feb 2002 10:01
- Location: USA
ORACLE SQL GROUP BY
</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
Можно чуть подробнее?
Спасибо
<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
Можно чуть подробнее?
Спасибо
-
- Уже с Приветом
- Posts: 456
- Joined: 14 Feb 2002 10:01
- Location: USA
ORACLE SQL GROUP BY
</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-м интересуются...
<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-м интересуются...
-
- Уже с Приветом
- Posts: 135
- Joined: 14 Sep 1999 09:01
- Location: Toronto, Canada
ORACLE SQL GROUP BY
Это можно, но только это будет 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 - то вторая.
Криво, зато выберет.
Ведь 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 - то вторая.
Криво, зато выберет.
-
- Уже с Приветом
- Posts: 135
- Joined: 14 Sep 1999 09:01
- Location: Toronto, Canada
ORACLE SQL GROUP BY
... Да, надеюсь на память, что вроде decode in Oracle8i are allowed in the group by clause. можно и без decode конечно.
Удачи!
Удачи!