2017-09-27 7 views
0

BigQueryでは、GAからのデータを使用して、セッションの最大ヒット数を持つページタイプを見つけることを試みていますユーザー。これは、どのpagetypeがセッションに最も多くのアクティビティを持っているかを判断するために使用されます(私は1つだけ、したがって最大)。BigQuery(従来のSQL)でセッション内の最大ヒットを見つける

行番号を使用してセッション内の各ページタイプのランクを割り当て、ランク1のフィルタリングは1人のユーザーに有効です。私が大きなデータセット(〜400GB)を複製しようとすると、「リソースを超過しました....」というエラーが表示されます。

BigQueryが新しく、このコードを最適化するためのヒントがありがとうございます。

#standardSQL 
SELECT 
    first_session.* 
FROM (
    SELECT 
    ARRAY_AGG(
     STRUCT(userid, sessionid, pagetype, hits) 
     ORDER BY sessionid ASC LIMIT 1 
    )[OFFSET(0)] AS first_session 
    FROM (
    SELECT 
     userid, 
     sessionid, 
     pagetype, 
     COUNT(*) AS hits 
    FROM `xxxxxxx` 
    GROUP BY 
     userid, 
     sessionid, 
     pagetype 
) 
    GROUP BY userid, sessionid 
); 

これは、各グループに関連する列を持つ構造体を構築し、sessionidによって決定されるように、最初のものだけを選択:standard SQLを使用して

SELECT 
    userid, 
    sessionid, 
    pagetype, 
    hits 
    FROM (
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY userid, sessionid ORDER BY sessionid ASC) rnk 
    FROM (
     SELECT 
     userid, 
     sessionid, 
     pagetype, 
     COUNT(1) AS hits 
     FROM 
     [xxxxxxx] WHERE 
     GROUP BY 
     userid, 
     sessionid, 
     pagetype 
     ORDER BY 
     sessionid, 
     hits DESC)) 
    WHERE 
    rnk = 1 
+1

BigQueryを初めてお使いの場合はなぜ旧式のSQLを使用しますか?標準のSQLを使用すると、例えばORDER BYとLIMITでARRAY_AGGを使用できます。 –

答えて

3

は、次のようなクエリを記述することができます。

関連する問題