2017-08-24 10 views
0

私はBiqQuery(数週間の経験)を使用して自分のスキルを向上させようとしています。私はユーザーWillian Fuksによって投稿された (Recreate GA Funnel on BigQuery)という非常に興味深い次の質問に関する素人的な質問があります。これは、効率的な方法でファンネルを再生するBigQueryのGAデータに関するものです。customDimension(BQ <> GA)の特定の値による選択

#standardSQL 
SELECT 
SUM((SELECT COUNTIF(eventInfo.eventAction = 'landing_page') FROM UNNEST(hits))) Landing_Page, 
SUM((SELECT COUNTIF(eventInfo.eventAction = 'model_selection_page') FROM UNNEST(hits) WHERE EXISTS(SELECT 1 FROM UNNEST(hits) WHERE eventInfo.eventAction = 'landing_page'))) Model_Selection 
FROM `64269470.ga_sessions_20170720` 

この例では、eventInfo.eventActionが使用されています。私もcustomDimensionと一緒に働くためにいくつかのことを試しましたが、失敗しました。誰も私はどのようにeventInfo.eventActionの代わりにcustomDimensionでそれをセグメント化するクエリを再現することができます知っていますか?私はこれで働い

:このフィールドはまた、配列型(繰り返し)であるため、customDimensionsでの作業

(SELECT MAX(IF(index=1,page1, NULL))FROM UNNEST(hits.customDimensions)) 

答えて

0

は、もう少し挑戦的です。それでも実際には、主な違いは別のUNNEST操作が必要であるということです。それ以外は、同じロジックです。

#standardSQL 
WITH data AS(
    SELECT '1' AS fullvisitorid, 1 AS visitid, ARRAY<STRUCT< hitNumber INT64, customDimension ARRAY<STRUCT<index INT64, value STRING> > >> [STRUCT(1 AS hitNumber, [STRUCT(1 AS index, 'landing_page' AS value), STRUCT(2 AS index, 'value2' AS value)] AS customDimension), 
                                      STRUCT(2 AS hitNumber, [STRUCT(1 AS index, 'value1' AS value), STRUCT(2 AS index, 'value2' AS value)] AS customDimension)] AS hits UNION ALL 

    SELECT '1' AS fullvisitorid, 2 AS visitid, ARRAY<STRUCT< hitNumber INT64, customDimension ARRAY<STRUCT<index INT64, value STRING> > >> [STRUCT(1 AS hitNumber, [STRUCT(1 AS index, 'landing_page' AS value), STRUCT(2 AS index, 'value2' AS value)] AS customDimension), 
                                      STRUCT(2 AS hitNumber, [STRUCT(1 AS index, 'landing_page' AS value), STRUCT(2 AS index, 'value2' AS value)] AS customDimension)] AS hits UNION ALL 

    SELECT '2' AS fullvisitorid, 1 AS visitid, ARRAY<STRUCT< hitNumber INT64, customDimension ARRAY<STRUCT<index INT64, value STRING> > >> [STRUCT(1 AS hitNumber, [STRUCT(1 AS index, 'model_selection_page' AS value), STRUCT(2 AS index, 'value2' AS value)] AS customDimension), 
                                      STRUCT(2 AS hitNumber, [STRUCT(1 AS index, 'value1' AS value), STRUCT(2 AS index, 'value2' AS value)] AS customDimension)] AS hits UNION ALL 

    SELECT '3' AS fullvisitorid, 1 AS visitid, ARRAY<STRUCT< hitNumber INT64, customDimension ARRAY<STRUCT<index INT64, value STRING> > >> [STRUCT(1 AS hitNumber, [STRUCT(1 AS index, 'landing_page' AS value), STRUCT(2 AS index, 'value2' AS value)] AS customDimension), 
                                      STRUCT(2 AS hitNumber, [STRUCT(3 AS index, 'model_selection_page' AS value), STRUCT(2 AS index, 'value2' AS value)] AS customDimension)] AS hits UNION ALL 

    SELECT '3' AS fullvisitorid, 2 AS visitid, ARRAY<STRUCT< hitNumber INT64, customDimension ARRAY<STRUCT<index INT64, value STRING> > >> [STRUCT(1 AS hitNumber, [STRUCT(1 AS index, 'landing_page' AS value), STRUCT(2 AS index, 'value2' AS value)] AS customDimension), 
                                      STRUCT(2 AS hitNumber, [STRUCT(3 AS index, 'model_selection_page' AS value), STRUCT(2 AS index, 'value2' AS value)] AS customDimension), 
                                      STRUCT(3 AS hitNumber, [STRUCT(3 AS index, 'model_selection_page' AS value), STRUCT(2 AS index, 'value2' AS value)] AS customDimension)] AS hits UNION ALL 
    SELECT '4' AS fullvisitorid, 1 AS visitid, ARRAY<STRUCT< hitNumber INT64, customDimension ARRAY<STRUCT<index INT64, value STRING> > >> [STRUCT(1 AS hitNumber, [STRUCT(1 AS index, 'landing_page' AS value), STRUCT(2 AS index, 'value2' AS value)] AS customDimension), 
                                      STRUCT(2 AS hitNumber, [STRUCT(3 AS index, 'model_selection_page' AS value), STRUCT(2 AS index, 'value2' AS value)] AS customDimension), 
                                      STRUCT(3 AS hitNumber, [STRUCT(3 AS index, 'model_selection_page' AS value), STRUCT(2 AS index, 'value2' AS value)] AS customDimension)] AS hits                                                                                                                                
) 

各ユーザー(fullvisitorid)および各セッション(visitid)そのhits ARRAYを持っています。ここでは

はあなたにそれを示すために、いくつかのデータがあります。通知私はそれぞれのヒットを、hitNumberで区切っています。これは、わかりやすくなります。

指数は3だったと値が「model_selection_page」ここで、次のクエリは、インデックス1と値を持つcustomDimension「landing_page」は起こった合計セッション数を計算し、同様に:

#standardSQL 
SELECT 
    SUM((SELECT 1 FROM UNNEST(hits), UNNEST(customDimension) WHERE index = 1 AND value = 'landing_page' LIMIT 1)) Landing_Page, 
    SUM((SELECT 1 FROM UNNEST(hits), UNNEST(customDimension) WHERE EXISTS(SELECT 1 FROM UNNEST(hits), UNNEST(customDimension) WHERE index = 1 AND value = 'landing_page') AND index = 3 AND value = 'model_selection_page' LIMIT 1)) Model_Selection 
FROM 
    data 

あなたがで遊ぶことができますここで何が起こっているのかをよりよく理解するためにシミュレートされたデータです。一言で言えば、UNNESTの2つが発生しています。最初にhitsの値を取得し、2番目の値はcustomDimensionの値を取得します。それは最初にあなたがこの表現に見ることができるように寸法を「landing_page」は、解雇されたかどうかを評価する必要があるため、

フィールドModel_Selectionは、もう少し複雑です:

EXISTS(SELECT 1 FROM UNNEST(hits), UNNEST(customDimension) WHERE index = 1 AND value = 'landing_page') 

hitsがどこかに「landing_page」を持っていた場合この式はWHERE句にTrueを返します。あなたはまたそうのような、ユーザレベルでの結果をもたらすことができる

#standardSQL 
SELECT 
    COUNT(DISTINCT (SELECT fullvisitorid FROM UNNEST(hits), UNNEST(customDimension) WHERE index = 1 AND value = 'landing_page' LIMIT 1)) Landing_Page, 
    COUNT(DISTINCT (SELECT fullvisitorid FROM UNNEST(hits), UNNEST(customDimension) WHERE EXISTS(SELECT 1 FROM UNNEST(hits), UNNEST(customDimension) WHERE index = 1 AND value = 'landing_page') AND index = 3 AND value = 'model_selection_page' LIMIT 1)) Model_Selection 
FROM 
    data 

あなたがBigQueryのを学習しているように、私は、シミュレートされたデータで遊んで出力を観察し、各段階のテストをお勧めします。 UNNESTで遊んで、その出力をテストするクエリをいくつか実行して、これらのテクニックの使い方をより深く理解することができます。

+0

徹底的な回答のために@willianfuksに感謝します!これは間違いなく私にそれを少し理解するのを助けるでしょう。私はまた、シミュレーションされたデータで遊んであなたのアドバイスをフォローします。 – Jesper

+0

ちょうど(長い)休暇から戻ってきました。私はクエリとシミュレーションデータの作業を開始しました。入力を検証すると、セッション数のわずかな違いがGAのUIデータと比較して約4%になりました。ユーザー(fullvisitorid)の場合、データは正確に対応しています。最初は、hits.typeがないために違いが生じたと仮定しましたが、このフィールドはArrayフィールドにアクセスできません。セッションでこの違いを引き起こす原因は何ですか? – Jesper

関連する問題