2017-09-22 56 views
0

新的在這裏。我試圖讓每日和每週的活躍用戶隨着時間的推移。他們有30天才被視爲不活躍。我的目標是創建可由user_id分割的圖形,以顯示組羣,區域,類別等。SQL - 不等的左連接BigQuery

我創建了一個日期表來獲取時間段內的每一天,並且我有基礎的簡化訂單表我需要計算這個信息。

我試圖做一個左連接使用下列SQL查詢來獲取日期的狀態:

WITH daily_use AS (
     SELECT 
      __key__.id as user_id 
      , DATE_TRUNC(date(placeOrderDate), day) as activity_date 
     FROM `analysis.Order` 
     where isBuyingGroupOrder = TRUE 
      and testOrder = FALSE 
     GROUP BY 1, 2 
), 
dates as (
     SELECT DATE_ADD(DATE "2016-01-01", INTERVAL d.d DAY) AS date 
     FROM 
      (
      SELECT ROW_NUMBER() OVER(ORDER BY __key__.id) -1 AS d 
      FROM `analysis.Order` 
      ORDER BY __key__.id 
      LIMIT 1096 
     ) AS d 
     order by 1 desc 
    ) 

SELECT 
     daily_use.user_id 
    , wd.date as date 
    , MIN(DATE_DIFF(wd.date, daily_use.activity_date, DAY)) as days_since_last_action 
FROM dates AS wd 

LEFT JOIN daily_use 
    ON wd.date >= daily_use.activity_date 
    AND wd.date < DATE_ADD(daily_use.activity_date, INTERVAL 30 DAY) 

GROUP BY 1,2 

我收到此錯誤:LEFT OUTER JOIN離不開這是一個平等條件下使用來自兩邊的領域。在BigQuery中,想知道我該如何解決這個問題。我在BigQuery中使用標準SQL。

謝謝

+0

可能的重複:https://stackoverflow.com/questions/43858433/bigquery-joining-on-multiple-conditions-using-subqueries-and-or-statements – phroureo

+0

BigQuery將嘗試讓你使用一個相等的條件,因爲這對於大型表不可擴展(在混洗數據時沒有共用密鑰)。如果你在一個WHERE子句中使用CROSS JOIN會發生什麼? –

回答

1

下面是BigQuery的標準SQL,大多與不包括天凡沒有活動都被發現

#standardSQL 
SELECT 
    daily_use.user_id 
    , wd.date AS DATE 
    , MIN(DATE_DIFF(wd.date, daily_use.activity_date, DAY)) AS days_since_last_action 
FROM dates AS wd 
CROSS JOIN daily_use 
WHERE wd.date BETWEEN 
    daily_use.activity_date AND DATE_ADD(daily_use.activity_date, INTERVAL 30 DAY) 
GROUP BY 1,2 
-- ORDER BY 1,2 

如果因任何原因的異常查詢重現邏輯你仍然需要exactly重現你的邏輯 - 你可以擁抱最後的左連接如下:

#standardSQL 
SELECT * 
FROM dates AS wd 
LEFT JOIN (
    SELECT 
    daily_use.user_id 
    , wd.date AS date 
    , MIN(DATE_DIFF(wd.date, daily_use.activity_date, DAY)) AS days_since_last_action 
    FROM dates AS wd 
    CROSS JOIN daily_use 
    WHERE wd.date BETWEEN 
    daily_use.activity_date AND DATE_ADD(daily_use.activity_date, INTERVAL 30 DAY) 
    GROUP BY 1,2 
) AS daily_use 
USING (date) 
-- ORDER BY 1,2 
+0

嘿米哈伊爾Berlyant, 這完全回答我的問題。你的第一個建議完美。我不需要填寫沒有數據的日期。範圍內的日期和訂單之間的日期是我們正在尋找的。謝謝一堆。 – SpasticCamel