2014-09-15 2 views
1

Я пытаюсь группировать семь дней для каждой даты, но это, похоже, не работает.Oracle GRoup на 7 дней

select 
START_DATE-7 FROM_DATES, 
SUM(EVENT_B), 
SUM(EVENT_B) 
    FROM (
    select 
    nvl(ENT1.DATE_FIELD,ENT2.DATE_FIELD)as START_DATE, 
    nvl(ENT1.EVENT_A,0) as EVENT_A, 
    nvl(ENT2.EVENT_B,0) as EVENT_B 
    from 
(select 
    DATE_FIELD, SUM(NR_EVENTS) as EVENT_A 
    from TABLE_A 
    where EVENT_NAME in ('CALL', 'EDIT','INSERT') 
    group by START_DATE,START_HOUR,SUBSCRIBER_TYPE,CO_ID 
) ENT1 
FULL OUTER JOIN 
(select 
DATE_FIELD, 
SUM(NR_EVENTS) as EVENT_B 
from TABLE_B 
where EVENT_NAME in ('CALL', 'EDIT','INSERT') 
group by DATE_FIELD 
) ENT2 
on ( 
ENT1.DATE_FIELD=ENT2.DATE_FIELD) 
) 
WHERE 
START_DATE >= START_DATE-7 
AND START_DATE <= START_DATE-1 
gROUP BY 
START_DATE-7 

Выход им получать:

9/8/2014 262187 280365 
9/7/2014 509405 478245 
9/6/2014 564663 537996 
9/5/2014 661871 632689 
9/4/2014 669788 638839 

Его единственная сумма за один день не 7

Вывод должен быть

2014-09-15, (сумма события со стороны, в 7 дней - 2014-09-15 -7 до 2014-09-15), (сумма события с B стороны за 7 дней - 2014-09-15 -7 до 2014-09-15)
2014-09-14, (сумма события со стороны, в период 7 дней - 2014-09-14 от -7 до 2014-09-14), (сумма события со стороны B в 7-дневного периода - 2014-09-14 -7 до 2014-09-14)
2014-09-13, (сумма события со стороны, в период 7 дней - 2014-09-13 от -7 до 2014-09-13), (сумма события со стороны B в 7-дневного периода - 2014-09-13 -7 до 2014-09-13)

и т.д. ...

Может кто-нибудь мне помочь?

+0

Просьба представить несколько примеров данных из обеих таблиц с текущим результатом вашего запроса и некоторым ожидаемым выходом. – yamny

ответ

2
with event_dates as (
    select d_field from table_a 
    union 
    select d_field from table_b 
) 
select 
    d_field from_date, 
    d_field to_date, 
    (
    select nvl(sum(nr_events),0) from table_a 
    where event_name in ('CALL', 'EDIT', 'INSERT') 
    and d_field between e.d_field and e.d_field+6 
) nr_events_a, 
    (
    select nvl(sum(nr_events),0) from table_b 
    where event_name in ('CALL', 'EDIT', 'INSERT') 
    and d_field between e.d_field and e.d_field+6 
) nr_events_b 
from event_dates e; 

Я сделал SQL Fiddle основанный на исходное сообщение и заметки от Lalit Kumar B. Ответ выше включает event_name фильтр поля, который был добавлен позже.

+0

Спасибо! Это решило проблему. – macieira

1

Ваш запрос неверен.

Во-первых, ваш вывод не совпадает с выбранными столбцами. Если 1-й столбец равен D_FIELD1+7, то как же на выходе первые значения столбца D_FIELD1?

Во-вторых, предикат AND D_FIELD1 BETWEEN D_FIELD1+7 AND D_FIELD1 неоднозначен.

В-третьих, BETWEEN будет включать верхнюю и нижнюю границу, поэтому вы получите окно продолжительностью 8 дней, а не 7 дней.

+0

Я обновил запрос – macieira

1

Вы можете использовать аналитическую функцию с интервалом, например.

SELECT nvl(ent1.date_field, ent2.date_field) - 6 start_date 
    , nvl(ent1.date_field, ent2.date_field) end_date 
    , sum(event_a) OVER 
     (ORDER BY nvl(ent1.date_field, ent2.date_field) 
      RANGE numtodsinterval(6, 'day') PRECEDING 
     ) sum_event_a 
    , sum(event_b) OVER 
     (ORDER BY nvl(ent1.date_field, ent2.date_field) 
      RANGE numtodsinterval(6, 'day') PRECEDING 
     ) sum_event_b 
FROM (SELECT date_field, 
      sum(nr_events) AS event_a 
     FROM table_a 
     WHERE event_name IN ('CALL', 'EDIT', 'INSERT') 
     GROUP BY date_field 
    ) ent1 
    FULL OUTER JOIN 
    (SELECT date_field, 
      sum(nr_events) AS event_b 
     FROM table_b 
     WHERE event_name IN ('CALL', 'EDIT', 'INSERT') 
     GROUP BY date_field 
    ) ent2 
     ON (ent1.date_field = ent2.date_field) 
1

Предлагаю вам изменить способ получения сумм, я предпочитаю в этом случае аналитические функции. Попробуйте что-то вроде этого:

SELECT START_DATE - 7 FROM_DATES, 
     SUM (EVENT_A) OVER (ORDER BY START_DATE RANGE 7 PRECEDING), 
     SUM (EVENT_B) OVER (ORDER BY START_DATE RANGE 7 PRECEDING) 
    FROM (SELECT NVL (ENT1.DATE_FIELD, ENT2.DATE_FIELD) AS START_DATE, 
       NVL (ENT1.EVENT_A, 0) AS EVENT_A, 
       NVL (ENT2.EVENT_B, 0) AS EVENT_B 
      FROM ( SELECT DATE_FIELD, SUM (NR_EVENTS) AS EVENT_A 
         FROM TABLE_A 
         WHERE EVENT_NAME IN ('CALL', 'EDIT', 'INSERT') 
        GROUP BY START_DATE, 
          START_HOUR, 
          SUBSCRIBER_TYPE, 
          CO_ID) ENT1 
       FULL OUTER JOIN 
        ( SELECT DATE_FIELD, SUM (NR_EVENTS) AS EVENT_B 
         FROM TABLE_B 
         WHERE EVENT_NAME IN ('CALL', 'EDIT', 'INSERT') 
        GROUP BY DATE_FIELD) ENT2 
       ON (ENT1.DATE_FIELD = ENT2.DATE_FIELD)) 
+0

Спасибо! Это решило проблему. – macieira

Смежные вопросы