2017-04-26 75 views
1

我正在嘗試按日期提取用戶活動。我正在嘗試使用交叉連接和where子句創建用戶帳戶創建後每天的表格。在我的情況下,交叉連接是不可避免的。日曆表只是過去365天(365行)的所有日期的列表。用戶表有〜1b行。BigQuery交叉加入失敗

這裏是一個失敗,資源不足查詢:

SELECT 
    u.user_id as user_id, 
    date(u.created) as signup_date, 
    cal.date as date, 
from (select date(dt) as date from [dw.calendar] where date(dt) < 
CURRENT_DATE()) cal 
    cross join each dw.user u 
where 
    date(u.created) <= cal.date 

基於https://cloud.google.com/bigquery/query-reference,交叉連接,甚至不支持「每個」條款。我如何執行上述操作來成功創建表格?

+0

確切錯誤:查詢失敗 錯誤:查詢超出層1的資源限制。需要層6或更高層。 – axrd

+1

使用[標準SQL](https://cloud.google.com/bigquery/docs/reference/standard-sql/)可能會更好,但即使在這種情況下,我懷疑您需要啓用更高的結算因爲交叉連接產生了多少行。 –

+0

請解釋 - 爲什麼你首先需要它?這只是在沒有交付任何值的情況下爆炸一些行數!很可能你打算把它作爲一箇中間/臨時表來處理它 - 所以我會建議寧願把重點放在最終目標上,而不是實現跨產品的東西。除非 - 當然 - 你有充分的理由,所以解釋一下 –

回答

3

您不需要填寫「空白」日來計算每日計數和執行窗口函數來獲取彙總總和,因此您甚至不需要日曆表。要做到這一點,你需要在窗口中使用RANGE vs. ROWS。見下面的例子(用於BigQuery的標準SQL)

#standardSQL 
SELECT 
    user_id, created, daily_count, 
    SUM(daily_count) OVER(
    PARTITION BY user_id ORDER BY created_unix_date DESC 
    RANGE BETWEEN CURRENT ROW AND 6 FOLLOWING 
) weekly_avg 
FROM `dw.user`, UNNEST([UNIX_DATE(created)]) AS created_unix_date 
ORDER BY user_id, created DESC 

我是不知道確切的模式/類型的表,這樣可能需要分別與上述調整,但同時可以測試/玩低於虛擬數據

#standardSQL 
WITH `dw.user` AS (
    SELECT 
    day AS created, 
    CAST(1 + 10 * RAND() AS INT64) AS user_id, 
    CAST(100 * RAND() AS INT64) AS daily_count 
    FROM UNNEST(GENERATE_DATE_ARRAY('2017-01-01', '2017-04-26')) AS day 
) 
SELECT 
    user_id, created, daily_count, 
    SUM(daily_count) OVER(
    PARTITION BY user_id ORDER BY created_unix_date DESC 
    RANGE BETWEEN CURRENT ROW AND 6 FOLLOWING 
) weekly_avg 
FROM `dw.user`, UNNEST([UNIX_DATE(created)]) AS created_unix_date 
ORDER BY user_id, created DESC