我正嘗試從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
)
結果輸出:
問題:
1)我想升ike查看給定頁面上的最後一個視頻播放事件,這是我使用WITHIN RECORD完成的,但正在嘗試上面顯示的ARRAY + ORDINAL方法。然而爲了這個工作,我認爲ARRAY()中的SELECT語句必須與外部記錄同步,因爲它現在變平了?這是否準確?
2)我還想得到一個COUNT的DISTINCT視頻播放給定的頁面,並想知道是否更有效的方法將加入到單獨的查詢或插入另一個內聯聚合函數,就像上面的ARRAY一樣。
任何建議,將不勝感激。
非常感謝Nhan,您的Row_Number與Rank分區的方法非常完美! – ScottP