2016-04-28 50 views
1

我試圖在BigQuery的新標準SQL功能上使用我的MSSQL查詢中的一個,因爲它需要特殊的JOIN條件。但是,該引用不包含BigQuery標準SQL中日期時間函數的任何解釋。BigQuery的標準SQL中的日期和時間函數

到目前爲止,我設法我DATE_ADD聲明 從轉換:DATE_ADD( '2015年1月1日',-13, '月') 到:DATE_ADD( '2015年1月1日',間隔-13 MONTH)

我還將YEAR(x)轉換爲EXTRACT(YEAR FROM x)。兩者似乎都是MySQL類似的語句。

最後,我注意到大多數日期函數的輸出必須使用TIMESTAMP轉換,然後才能比較它們。

但現在我的查詢終於想運行我得到一個「內部錯誤」。任何人都知道什麼可能是錯的?這是查詢:

SELECT 
    M, 
    Bought12MBeforeM, 
    Bought12MBeforeAndInM, 
    (Bought12MBeforeAndInM * 1.0)/(Bought12MBeforeAndInM + Bought12MBeforeM) AS RepurchaseRate 
FROM (
    SELECT 
    M, 
    COUNT(DISTINCT CASE WHEN MaxM < TIMESTAMP(M) THEN user_id ELSE NULL END) AS Bought12MBeforeM, 
    COUNT(DISTINCT CASE WHEN MaxM >= TIMESTAMP(M) 
     AND MinM < TIMESTAMP(M) THEN user_id ELSE NULL END) AS Bought12MBeforeAndInM 
    FROM (
    SELECT 
     M, 
     user_id, 
     MAX(cart_creation_date) AS MaxM, 
     MIN(cart_creation_date) AS MinM 
    FROM (
     SELECT 
     user_id, 
     cart_creation_date 
     FROM 
     `vex-eu-cloud-sql-001.work_user.flat_orders` 
     WHERE 
     cart_creation_date >= TIMESTAMP(DATE_ADD('2015-01-01', INTERVAL -13 MONTH)) 
     GROUP BY 
     user_id, 
     cart_creation_date) UniqueCarts 
    INNER JOIN (
     SELECT 
     DATE(Day) AS M 
     FROM 
     `vex-custom.wouter.days_2007_2020` 
     WHERE 
     EXTRACT(YEAR 
     FROM 
      Day) >= 2015 
     AND EXTRACT(DAY 
     FROM 
      Day) = 1 
     AND Day < TIMESTAMP(CURRENT_DATE())) Months 
    ON 
     cart_creation_date > TIMESTAMP(DATE_ADD(M, INTERVAL -13 MONTH)) 
     AND cart_creation_date < TIMESTAMP(DATE_ADD(M, INTERVAL 1 MONTH)) 
    GROUP BY 
     M, 
     user_id) BoughtInM 
    GROUP BY 
    M) Results 
+0

如果你提供工作的ID,我可以看一下是什麼造成了內部錯誤 –

+0

沒啥嗨,這是** vex-production:bquijob_343984cc_1545ef2e7a4 ** – Wouter

+0

好的,我在調查失敗後更新了答案。 –

回答

1

錯誤是由於在標準SQL的WHERE子句中處理TIMESTAMP的錯誤。目前的解決方法是UNIX_MICROS功能來包裝它從TIMESTAMP到INT64翻譯,那麼你的查詢工作:

SELECT 
    M, 
    Bought12MBeforeM, 
    Bought12MBeforeAndInM, 
    (Bought12MBeforeAndInM * 1.0)/(Bought12MBeforeAndInM + Bought12MBeforeM) AS RepurchaseRate 
FROM (
    SELECT 
    M, 
    COUNT(DISTINCT CASE WHEN MaxM < TIMESTAMP(M) THEN user_id ELSE NULL END) AS Bought12MBeforeM, 
    COUNT(DISTINCT CASE WHEN MaxM >= TIMESTAMP(M) 
     AND MinM < TIMESTAMP(M) THEN user_id ELSE NULL END) AS Bought12MBeforeAndInM 
    FROM (
    SELECT 
     M, 
     user_id, 
     MAX(cart_creation_date) AS MaxM, 
     MIN(cart_creation_date) AS MinM 
    FROM (
     SELECT 
     user_id, 
     cart_creation_date 
     FROM 
     `vex-eu-cloud-sql-001.work_user.flat_orders` 
     WHERE 
     UNIX_MICROS(cart_creation_date) >= UNIX_MICROS(TIMESTAMP(DATE_ADD('2015-01-01', INTERVAL -13 MONTH))) 
     GROUP BY 
     user_id, 
     cart_creation_date) UniqueCarts 
    INNER JOIN (
     SELECT 
     DATE(Day) AS M 
     FROM 
     `vex-custom.wouter.days_2007_2020` 
     WHERE 
     EXTRACT(YEAR FROM Day) >= 2015 
     AND EXTRACT(DAY FROM Day) = 1 
     AND UNIX_MICROS(Day) < UNIX_MICROS(TIMESTAMP(CURRENT_DATE()))) Months 
    ON 
     cart_creation_date > TIMESTAMP(DATE_ADD(M, INTERVAL -13 MONTH)) 
     AND cart_creation_date < TIMESTAMP(DATE_ADD(M, INTERVAL 1 MONTH)) 
    GROUP BY 
     M, 
     user_id) BoughtInM 
    GROUP BY 
    M) Results 
+0

好吧,試過,但得到了這個:_Error:TIMESTAMP_ADD不支持MONTH日期部分_ – Wouter

+0

該參考文獻提到YEAR,DAY和其他日期部分函數。但所有這些給我:_Error:找不到函數:YEAR_ – Wouter

+0

我將更新文檔以明確日期部分,如YEAR和DAY應在EXTRACT函數內部使用。 –