2016-04-12 3 views
1

Вот моя попытка сгруппировать по прокатной неделе и на прошлой неделе. Я понимаю ошибку, но когда я группируюсь по дням, минимум становится минимумом каждой строки и, следовательно, не является минимальным набором.Bigquery Группировка по дням проката

Должен быть простой способ группировки дней в Bigquery.

select 
    n_rtb_impressions, 
    if(dayy between min(dayy) and (min(dayy) + 6) ,1, 0) as D 
from 
    (SELECT 
    ((dayofyear(datetime))) as dayy, 
     sum(IF(c_priority IN (19,20,21), IFNULL(s_impressions,0)-IFNULL(hybrid_p_back,0), 0)) AS n_rtb_impressions, 
     FROM 
     TABLE_DATE_RANGE(hourly_stats.v1_,DATE_ADD(CURRENT_DATE(),-14,"day"),DATE_ADD(CURRENT_DATE(),-1,"day")) 
     group by dayy) 

EDIT с помощью ниже, а затем некоторые игры вокруг мне удалось расширить его для нескольких размеров, а затем отфильтровать результаты, так что каждая группа имеет размеры только два ряда, один за сумму 1-7 дней и один на 8-14 дней. Затем я использовал NTH для поворота данных, поэтому группировка теперь является размерностью. Я помещу его здесь для других:

select 
server, 
a_name, 
w_name, 
rtb_name, 

NTH(1, last_7_days_n_rtb_impressions_1) This_week, NTH(2, last_7_days_n_rtb_impressions_1) Last_Week, 

from(
    select 
     [date], 
     dw, 
     server, 
     a_name, 
     w_name, 
     rtb_name, 
     last_7_days_n_rtb_impressions_1 
    from(
     SELECT 
      [date], 
      dw, 
      SUM(n_rtb_impressions) OVER(ORDER BY rtb_name, server, a_name, w_name,[date] 
       ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS last_7_days_n_rtb_impressions_1, 
      server, 
      a_name, 
      w_name, 
      rtb_name, 
     FROM (
      SELECT 
       server, 
       a_name, 
       w_name, 
       rtb_name, 
       dayofweek(datetime) as dw, 
       DATE(datetime) AS [date], 
       SUM(IF(c_priority IN (19,20,21), IFNULL(s_impressions,0)-IFNULL(hybrid_p_back,0), 0)) AS n_rtb_impressions, 

      FROM TABLE_DATE_RANGE(hourly_stats.v1_,DATE_ADD(CURRENT_DATE(),-14,"day"), 
       DATE_ADD(CURRENT_DATE(),-1,"day")) 

      GROUP BY [date],dw,server, 
       a_name, 
       w_name, 
       rtb_name, 
      order by rtb_name,server, a_name,w_name, [date]) 

      order by rtb_name,server, a_name,w_name,) 

      where dw = dayofweek(DATE_ADD(CURRENT_DATE(),-1,"day")) 

      order by rtb_name,server, a_name,w_name, [date]) 

      group by 
      server, 
      a_name, 
      w_name, 
      rtb_name, 
+0

Я попытался сделать отступы следовать стандартным соглашениям, но он не может быть на 100% правильным. Вы можете проверить это? –

+0

Я бы хотел, но моя новая работа использует оракул и sql-сервер, поэтому больше нет на bigquery. Я ценю вашу помощь! –

ответ

1

Стараясь быть как можно ближе к примеру, как это возможно

last_7_days_n_rtb_impressions_1 - производит правильный вывод в том случае, если у вас нет каких-либо пробелов в ваши дни в течение года , И он будет продолжать считать 7 дней назад даже в новом году

last_7_days_n_rtb_impressions_2 - производит правильный выход, даже если в течение года в течение промежутка времени есть пробел. И это начинается с 0 yeach year. Конечно, это может быть дополнительно настроено, чтобы отразить ваши потребности

Надежда это хороший старт для вас

См window-frame-clause раздела Window functions для получения более подробной информации

SELECT 
    [date], dayy, n_rtb_impressions, 
    SUM(n_rtb_impressions) OVER(ORDER BY [date] 
     ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS last_7_days_n_rtb_impressions_1, 
    SUM(n_rtb_impressions) OVER(ORDER BY [date] 
     RANGE BETWEEN 6 PRECEDING AND CURRENT ROW) AS last_7_days_n_rtb_impressions_2 
FROM (
    SELECT 
    DAYOFYEAR(datetime) AS dayy, 
    DATE(datetime) AS [date], 
    SUM(IF(c_priority IN (19,20,21), IFNULL(s_impressions,0)-IFNULL(hybrid_p_back,0), 0)) AS n_rtb_impressions, 
    FROM TABLE_DATE_RANGE(hourly_stats.v1_,DATE_ADD(CURRENT_DATE(),-14,"day"), 
     DATE_ADD(CURRENT_DATE(),-1,"day")) 
    GROUP BY dayy, [date] 
) 
ORDER BY 1 
+0

Спасибо за помощь! –

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