簡體   English   中英

用於滑動窗口聚合的Bigquery SQL

[英]Bigquery SQL for sliding window aggregate

嗨我有一張看起來像這樣的桌子

Date         Customer   Pageviews
2014/03/01   abc          5
2014/03/02   xyz          8
2014/03/03   abc          6

我想獲得按周分組的頁面視圖聚合,但顯示過去30天的聚合 - (每周30天的窗口大小的滑動窗口聚合)

我正在使用google bigquery

編輯:戈登 - 你對“客戶”的評論,實際上我需要的是稍微復雜一點,這就是為什么我把客戶列入上表。 我希望每周在30天的窗口中獲得超過n次網頁瀏覽量的客戶數量。 這樣的事情

Date        Customers>10 pageviews in 30day window
2014/02/01  10
2014/02/08  5
2014/02/15  6
2014/02/22  15

然而,為了保持簡單,如果我只能得到一個滑動窗口聚合的網頁瀏覽而忽略了客戶,我會按照自己的方式工作。 這樣的事情

Date        count of pageviews in 30day window
2014/02/01  50
2014/02/08  55
2014/02/15  65
2014/02/22  75

這個怎么樣:

SELECT changes + changes1 + changes2 + changes3 changes28days, login, USEC_TO_TIMESTAMP(week)
FROM (
  SELECT changes,
         LAG(changes, 1) OVER (PARTITION BY login ORDER BY week) changes1,
         LAG(changes, 2) OVER (PARTITION BY login ORDER BY week) changes2,
         LAG(changes, 3) OVER (PARTITION BY login ORDER BY week) changes3,
         login,
         week
  FROM (
    SELECT SUM(payload_pull_request_changed_files) changes, 
           UTC_USEC_TO_WEEK(created_at, 1) week,
           actor_attributes_login login,
    FROM [publicdata:samples.github_timeline]
    WHERE payload_pull_request_changed_files > 0
    GROUP BY week, login
))
HAVING changes28days > 0

對於每個用戶,它會計算每周提交的更改數量。 然后使用LAG()我們可以查看下一行,他們提交的-1,2和-3周的變化數量。 然后,我們只需添加這4周,即可查看過去28天內提交的更改數量。

現在,您可以將所有內容包裝在新查詢中,以過濾更改> X的用戶,並對其進行計數。

我創建了以下“Times”表:

Table Details: Dim_Periods
Schema
Date    TIMESTAMP   
Year    INTEGER         
Month   INTEGER         
day         INTEGER         
QUARTER INTEGER     
DAYOFWEEK   INTEGER     
MonthStart  TIMESTAMP   
MonthEnd    TIMESTAMP   
WeekStart   TIMESTAMP   
WeekEnd TIMESTAMP   
Back30Days  TIMESTAMP   -- the date 30 days before "Date"
Back7Days   TIMESTAMP   -- the date 7 days before "Date"

我使用這樣的查詢來處理“運行總和”

SELECT Date,Count(*) as MovingCNT
FROM

(SELECT Date,
                Back7Days 
                    FROM DWH.Dim_Periods  
                 where Date < timestamp(current_date()) AND
                             Date >= (DATE_ADD (CURRENT_TIMESTAMP(), -5, 'month'))
                )P
                CROSS JOIN EACH
    (SELECT repository_url,repository_created_at
    FROM publicdata:samples.github_timeline
                ) L
        WHERE timestamp(repository_created_at)>= Back7Days 
              AND timestamp(repository_created_at)<= Date

GROUP EACH BY Date

請注意,它可以用於“月到日”,“每周更新”,“30天后”等聚合。但是,性能不是最好的,並且由於笛卡爾,查詢可能需要一段時間才能處理更大的數據集加入。希望這有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM