Группировка данных SQL / Oracle по полям по часам для определенного типа в определенный день - PullRequest
4 голосов
/ 26 января 2011

Хорошо, я пытаюсь создать один запрос, чтобы сэкономить уйму времени (а не писать кучу отдельных запросов), но я даже не знаю, с чего начать

Что мне нужно, так это посмотреть на single day and type и разбить счет на действия по часам с 8:00 до 20:00. Так, например, у меня есть следующая поддельная таблица

TYPE_   ACTION_     TIMESTAMP_
------------------------------
A       processed   2010-11-19 10:00:00.000
A       processed   2010-11-19 10:46:45.000
A       processed   2010-11-19 11:46:45.000
A       processed   2010-11-19 12:46:45.000
A       processed   2010-11-19 12:48:45.000
A       pending     2010-11-19 11:46:45.000
A       pending     2010-11-19 11:50:45.000
A       pending     2010-11-19 12:46:45.000
A       pending     2010-11-19 12:48:45.000
B       pending     2010-11-19 19:48:45.000
B       pending     2010-11-19 21:46:45.000
.etc

Так что, если бы я хотел посмотреть все записи с

  • TYPE_ = 'A'
  • на дату 2010-11-19
  • сгруппировано по ACTION_ в час

Я бы увидел этот результат

ACTION_ NUMOCCURENCES   RANGE
---------------------------------------------
processed  2                10:00:00 - 11:00:00
pending    0                10:00:00 - 11:00:00
processed  1                11:00:00 - 12:00:00
pending    2                11:00:00 - 12:00:00
processed  2                12:00:00 - 13:00:00
pending    2                12:00:00 - 13:00:00

Или что-то похожее на это, но это должно, по крайней мере, дать представление о том, что я ищу.

Кто-нибудь может помочь? Обычно я пытаюсь предоставить пример кода, с которым я работаю, но я понятия не имею, как я буду работать с группой с помощью предложений, необходимых для этого.

Ответы [ 2 ]

7 голосов
/ 26 января 2011
select
   action_,
   count(*) as numoccurences,
   to_char(timestamp_       , 'hh24') || ':00:00-' || 
   to_char(timestamp_ + 1/24, 'hh24') || ':00:00' as range
 from 
   tq84_action 
 where  
   timestamp_ between timestamp '2010-11-19 08:00:00' and 
                      timestamp '2010-11-19 20:00:00' and
   type_ = 'A'
 group by
   action_,
   to_char(timestamp_       , 'hh24') || ':00:00-' || 
   to_char(timestamp_ + 1/24, 'hh24') || ':00:00' 
 order by 
   range;

Теперь вышеприведенный оператор выбора возвращает только часов , в которых есть хотя бы действие. Чтобы показать запись для всех комбинаций часов - {обработанных / ожидающих}, необходимо внести следующие изменения в запрос:

select
   action_,
   count(type_) as numoccurences,
   to_char(timestamp_       , 'hh24') || ':00:00-' || 
   to_char(timestamp_ + 1/24, 'hh24') || ':00:00' as range_
 from (
   select * from tq84_action 
    where  
      timestamp_ between timestamp '2010-11-19 08:00:00' and 
                         timestamp '2010-11-19 20:00:00' and
      type_ = 'A'
    union all (
      select 
        null as type_,
        action.name_ as action_,
        date '2010-11-19' + 8/24 + hour.counter_ / 24 as timestamp_1
      from (
        select  
          level-1 counter_
        from dual
          connect by level <= 12
      ) hour,
      ( 
        select 'processed' as name_ from dual union all
        select 'pending'   as name_ from dual
      ) action
    )
 )
 group by
   action_,
   to_char(timestamp_       , 'hh24') || ':00:00-' || 
   to_char(timestamp_ + 1/24, 'hh24') || ':00:00' 
 order by 
   range_;

Кстати, вот DDL и DML, которые я использовал:

drop   table tq84_action;
create table tq84_action (
  type_      varchar2( 1),
  action_    varchar2(10),
  timestamp_ timestamp
);


insert into tq84_action values('A', 'processed' , timestamp '2010-11-19 10:00:00.000');
insert into tq84_action values('A', 'processed' , timestamp '2010-11-19 10:46:45.000');
insert into tq84_action values('A', 'processed' , timestamp '2010-11-19 11:46:45.000');
insert into tq84_action values('A', 'processed' , timestamp '2010-11-19 12:46:45.000');
insert into tq84_action values('A', 'processed' , timestamp '2010-11-19 12:48:45.000');
insert into tq84_action values('A', 'pending'   , timestamp '2010-11-19 11:46:45.000');
insert into tq84_action values('A', 'pending'   , timestamp '2010-11-19 11:50:45.000');
insert into tq84_action values('A', 'pending'   , timestamp '2010-11-19 12:46:45.000');
insert into tq84_action values('A', 'pending'   , timestamp '2010-11-19 12:48:45.000');
insert into tq84_action values('B', 'pending'   , timestamp '2010-11-19 19:48:45.000');
insert into tq84_action values('B', 'pending'   , timestamp '2010-11-19 21:46:45.000');
3 голосов
/ 26 января 2011
select
   ACTION_
   count(*) NUMOCCURENCES,
   to_char(TIMESTAMP_, 'hh24') || ':00:00 - ' || to_char(TIMESTAMP_ + 1/24, 'hh24') || ':00:00' RANGE
from tbl
where TIMESTAMP_ between DATE '2010-11-19' and DATE '2010-11-20'
  and TYPE_ = 'A'
  and 1 * to_char(TIMESTAMP_, 'hh24') between 8 and 19
group by ACTION_, to_char(TIMESTAMP_, 'hh24'), to_char(TIMESTAMP_ + 1/24, 'hh24')
order by RANGE, ACTION_ desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...