2017-10-10 7 views
0

BigQuery Legacy SQLから標準SQLに移行しようとしています。レガシー製品は、何度も便利な "WITHIN RECORD"を検索する機能を提供しました。レガシーSQLからの移行:標準SQLで "WITHIN RECORD"のオプション

私はWITHIN RECORDの代わりに効率的な方法を探しています。 ARRAY + ORDINALを使用するとより効率的な方法があるかどうか疑問に思うかもしれません。

例:私はリットルでしょう)

1:

Table 1

質問:出力結果、次の標準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 
) 

を考えてみましょう私はWITHIN RECORDを使って達成したものですが、上記のARRAY + ORDINALアプローチを試しています。しかし、これがうまくいくためには、ARRAY()内のSELECT文が、フラット化されているので外部レコードと同期させる必要があると思いますか?それは正確ですか?

2)また、特定のページでDISTINCTビデオの数をカウントして、より効率的なアプローチが別のクエリに参加するか、上記のARRAYで行われたような別のインライン集約関数を挿入するのかどうか疑問です。

何か提案がありがとうございます。

答えて

2

1)私はレコード内の使用して達成が、上記のよう ARRAY + ORDINALアプローチを試みています使用したものである 、特定のページ上の最後のビデオプレイイベントを見たいのですが。しかし、これが動作するためには、 私はARRAY()内のSELECTステートメントが今平らになっているので、外部レコードに を同期させる必要があると思いますか?それは正確ですか?

私は正しいと思います。あなたのクエリでは、内側のクエリからのUNNEST(ヒット)はUNNESTの外側から独立していて、おそらくあなたが望むことを望んでいません。私はそれを書くかもしれない一つの方法は、このだと思う

:私もDISTINCT動画のCOUNTを取得したいと思います)

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は、与えられた ページ上で再生し、より効率的なアプローチが可能かどう不思議 別のクエリに結合するか、上記のARRAYで完了した のような別のインライン集約関数を挿入します。

私は両方ともOKだと思いますが、別のインライン集計関数を挿入すると、それらがより近く評価されるため、クエリエンジンがチャンスがあれば最適化するのが少し楽になるかもしれません。

+0

多くの方に感謝します。Nhan、Row_Numberを使ったあなたのアプローチは、Rankとのパーティション上で完璧に動作しました! – ScottP

関連する問題