2017-11-29 4 views
0

Googleアナリティクスデータを計算するためにStandardSQLを使用してBig QueryにSQLクエリを書き込もうとしています。私はまだBigQueryでの作業を学んでおり、複雑さに合わせて調整しています。BigQueryの最初のネストされたページ行にカスタムディメンション値が含まれているかどうかを確認

私のGAテーブルの各セッションについて、一定の日数にわたって繰り返し、 "PAGE"タイプのFIRSTヒットを特定したいとします。そのヒットで、私は特定のカスタムディメンションの値を返したいと思います。カスタムディメンションはセッションスコープですが、この特定のヒットの値のみを知りたいとします。

私はセッションでparitionと、次のように試してみる必要があると思うが、私は第二ネスティング

SELECT (SELECT value from hits.customDimension where hits.customDimension.index == 13) OVER(fullVisitorID) FROM 
     `ga_sessions_2017*` AS t 
    WHERE 
     _TABLE_SUFFIX BETWEEN '0901' 
     AND '0930' 
     AND totals.hits > 2) 
     AND row_number() = 1 
     AND hit.type = "PAGE" 
GROUP BY 1 

に関する立ち往生しています私は、UDFを使用して、以下を試してみましたが、私は私が書いたことは完全に知っています非効率的な。

#standardSQL 
CREATE TEMP FUNCTION 
    isDefined(json_str STRING) 
    RETURNS STRING 
    LANGUAGE js AS """ 
var row = JSON.parse(json_str); 
var defined = "no"; 

for(i=0; i < row.length; i++) { 
if(row[i].type != "PAGE") continue; 
row[i].customDimensions.forEach(function(cd) { 
if(cd.index == "13" || cd.index == 13) { 
if(cd.value !== null || cd.value !== "") defined = "yes"; 
} 
}); 
return defined; 
} 


"""; 
SELECT becomesDefined, count(*) FROM (
SELECT 
    isDefined(TO_JSON_STRING(t.hits)) as becomesDefined 
FROM 
    `ga_sessions_2017*` AS t 
WHERE 
    _TABLE_SUFFIX BETWEEN '0901' 
    AND '0930' 
    AND totals.hits > 2) GROUP BY 1 

答えて

1

カスタムディメンションは、セッションがスコープされている場合は一つの行が一つのセッションに等しいので、次に、全体の行の一つの値だけが存在するであろう。 このクエリーでは、セッションレベルからのカスタムディメンション値(13も同じですが、簡単に変更できます)のようにヒットスコープで最初にヒットしたcd13値が取得されます。

SELECT 
    (SELECT cd.value 
    FROM t.hits h, h.customDimensions cd 
    WHERE type='PAGE' AND cd.index=13 
    ORDER BY hitnumber ASC 
    LIMIT 1) AS firstHitCd13, 

    (SELECT value 
    FROM UNNEST(t.customDimensions) 
    WHERE index=13) AS sessionLevelCd13 

FROM 
    `project.dataset.ga_sessions_201712*` t 
LIMIT 
    1000 

最初のサブセレクトでは、カスタムディメンション配列のクロスジョインが使用されます。 2番目のものは単にcustomDimensions配列をネストしません。 1つの結果テーブル行は、ソーステーブルの1つのセッション/行に等しい

関連する問題