2016-04-12 19 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) 

編輯與下面的幫助,然後一些玩弄我設法擴大它多維度,然後篩選出結果使得每個組的尺寸只有兩行,一行總和爲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

我試圖讓壓痕遵循標準慣例的Window functionswindow-frame-clause部分,但它可能不是100%正確的。你能檢查它嗎? –

+0

我會的,但我的新工作使用oracle和sql服務器,所以不再在bigquery上。我感謝您的幫助! –

回答

1

試圖儘可能靠近你的例子儘可能

last_7_days_n_rtb_impressions_1 - 的情況下,產生正確的輸出,如果你沒有在一年內你的日子的任何差距。 即使在新的一年中,它也會繼續計數7天

last_7_days_n_rtb_impressions_2 - 即使在一年中的日子中存在差距,也會產生正確的輸出。它從0年開始。當然,這可以進一步調整,以反映您的需求

希望這是良好的開端,你

詳情參見

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

感謝您的幫助! –