2017-10-10 35 views
0

我正嘗試從BigQuery Legacy SQL遷移到標準SQL。 Legacy產品提供了查詢「WITHIN RECORD」的功能,這種功能在很多場合派上用場。從傳統SQL遷移:標準SQL的「WITHIN RECORD」選項

我正在尋找WITHIN RECORD的高效替代方案。我總是可以使用幾個子查詢並加入它們,但是想知道是否可以使用ARRAY + ORDINAL更有效的方法。

的例子:考慮下列標準SQL

WITH 
    sessPageVideoPlays AS (
    SELECT fullVisitorId, visitNumber, h.page.pagePath, 
     # This would previously use WITHIN RECORD in Legacy SQL: 
     ARRAY(SELECT eventInfo.eventAction FROM UNNEST(hits) 
       WHERE eventInfo.eventCategory="videoPlay" 
       ORDER BY hitNumber DESC 
     )[ORDINAL(1)] AS lastVideoSeen 
    FROM 
      `proj.ga_sessions`, UNNEST(hits) as h 
    GROUP BY fullVisitorId, visitNumber, h.page.pagePath, lastVideoSeen 
) 
SELECT 
    pagePath, lastVideoSeen, numOccur 
FROM 
    (SELECT  
     pagePath, lastVideoSeen, count(1) numOccur 
     FROM 
     sessPageVideoPlays 
     GROUP BY 
     pagePath, lastVideoSeen 
) 

結果輸出:

Table 1

問題:

1)我想升ike查看給定頁面上的最後一個視頻播放事件,這是我使用WITHIN RECORD完成的,但正在嘗試上面顯示的ARRAY + ORDINAL方法。然而爲了這個工作,我認爲ARRAY()中的SELECT語句必須與外部記錄同步,因爲它現在變平了?這是否準確?

2)我還想得到一個COUNT的DISTINCT視頻播放給定的頁面,並想知道是否更有效的方法將加入到單獨的查詢或插入另一個內聯聚合函數,就像上面的ARRAY一樣。

任何建議,將不勝感激。

回答

2

1)我想看到特定網頁上的最後一個視頻播放事件, 這是我用來使用WITHIN RECORD完成,但我試圖 上面顯示的ARRAY + ORDINAL方法。然而,爲了這個工作, 我想在ARRAY()內的SELECT語句必須得到同步 外部記錄,因爲它現在是平坦的?這是否準確?

我認爲這是正確的。通過查詢,來自內部查詢的UNNEST(點擊)將獨立於UNNEST外部,並且可能不是您想要的。

我想也許一個方式來寫是這樣的:

WITH 
    sessPageVideoPlays AS (
    SELECT fullVisitorId, visitNumber, 
     ARRAY(
      SELECT AS STRUCT pagePath, lastVideoSeen FROM (
      SELECT 
       page.pagePath, 
       eventInfo.eventAction AS lastVideoSeen, 
       ROW_NUMBER() OVER (PARTITION BY page.pagePath ORDER BY hitNumber DESC) AS rank 
      FROM UNNEST(hits) 
      WHERE eventInfo.eventCategory="videoPlay") 
      WHERE rank = 1 
     ) AS lastVideoSeenOnPage 
    FROM 
     `proj.ga_sessions` 
) 
SELECT 
    pagePath, lastVideoSeen, numOccur 
FROM (
    SELECT 
    pagePath, lastVideoSeen, count(1) numOccur 
    FROM 
    sessPageVideoPlays, UNNEST(lastVideoSeenOnPage) 
    GROUP BY 
    pagePath, lastVideoSeen 
) 

2)我也想獲得DISTINCT影片COUNT起到了給定 網頁上,並想知道是否更有效的方法是加入到 單獨的查詢或插入另一個內聯聚合函數,如上面用ARRAY完成的 。

我認爲兩者都可以,但插入另一個內聯聚合函數會將它們靠得更近,所以如果有機會,查詢引擎可能會更容易優化。

+0

非常感謝Nhan,您的Row_Number與Rank分區的方法非常完美! – ScottP