2017-04-14 10 views
2

私は、ユーザーレベルでBigqueryでチャンネルパスを作成します。私は、トランザクションが発生したときにパスを終了します。次の訪問は新しいパスを開始します。現在、私はすべてのトランザクションを集計するユーザーごとに1つのパスを持っています。下記のコードを参照してください。また、現在のOUTPUT TABLEと必要なOUTPUT TABLEも含めました。イベントに基づいてBigQueryでチャンネルパスを作成するにはどうすればよいですか?

私の考えは、トランザクションをカウントしている新しい列を作成することです。この値は0から始まり、トランザクションが発生した後に1だけインクリメントする必要があります。次に、この値をuser_id値とマージし、集約された文字列をその変数にグループ化します。しかし、私はこれを行う方法を知らない。

ありがとうございます!

グイド

#standardSQL 
WITH yourTable AS (
    SELECT 1 AS user_id,'1a' as visit_id, '2017-01-01 14:10:12' AS DATETIME, 
'google cpc' AS channelgrouping, 0 AS transaction , 1 as visit UNION ALL 
    SELECT 1, '1b', '2017-01-01 20:10:12', 'email', 1, 1 UNION ALL 
    SELECT 1, '1c','2017-01-03 08:10:12', 'direct', 0, 1 UNION ALL 
    SELECT 1, '1d','2017-01-04 13:10:14', 'organic', 1, 1 
) 
SELECT 
    user_id, 
    STRING_AGG(channelgrouping, ' > ' ORDER BY DATETIME) AS channelgrouping_path, 
    SUM(transaction) AS transaction, 
    SUM(visit) AS visits 
FROM yourTable 
GROUP BY user_id 

出力テーブル

user_id|channgelgrouping_path    |Transactions|Visits 
1  |google cpc > email > direct > organic| 2   | 4 

所望の出力TABLE

user_id|channgelgrouping_path    |Transactions|Visits 
1  |google cpc > email     | 1   | 2 
1  |direct > organic      | 1   | 2 

答えて

2

#standardSQL 
WITH yourTable AS (
    SELECT 1 AS user_id,'1a' AS visit_id, '2017-01-01 14:10:12' AS DATETIME, 
'google cpc' AS channelgrouping, 0 AS transaction , 1 AS visit UNION ALL 
    SELECT 1, '1b', '2017-01-01 20:10:12', 'email', 1, 1 UNION ALL 
    SELECT 1, '1c','2017-01-03 08:10:12', 'direct', 0, 1 UNION ALL 
    SELECT 1, '1d','2017-01-04 13:10:14', 'organic', 1, 1 
) 
SELECT 
    user_id, 
    STRING_AGG(channelgrouping, ' > ' ORDER BY DATETIME) AS channelgrouping_path, 
    SUM(transaction) AS transaction, 
    SUM(visit) AS visits 
FROM (
    SELECT 
    *, 
    SUM(transaction) OVER(PARTITION BY user_id ORDER BY datetime 
       ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING 
    ) AS grp 
    FROM yourTable 
) 
GROUP BY user_id, IFNULL(grp, 0) 
以下

をお試しください
+0

もう一度おねがいします。これは私が探していたものです。 おそらく、無期限のプレシードと1プレッシング機能の間の行を説明できますか?なぜGROUP BYにIFNULL(grp、0)を追加しましたか? – gvkleef

+0

分析関数のチェックhttps://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#analytic-functions、特にウィンドウ枠節。 'UNBOUNDED PRECEDINGと1 PRECEDINGの間に行こう 'と言っています - 現在の行の前にあるすべての行に対してSUMを実行します。非常に最初の行のために必要な 'IFNULL(grp、0)' - 先行する行がないので、合計は0になる必要があります。 –

+0

訪問のタイムスタンプパスの最初と最後のチャンネルの?私は最初に新しい質問を作成する前にあなたに尋ねると思った。 – gvkleef

関連する問題