GA BigQuery - 购买产品 x 的用户也购买了产品 abc 然后仅过滤列出完整的交易,其中 x 是交易的一部分
Posted
技术标签:
【中文标题】GA BigQuery - 购买产品 x 的用户也购买了产品 abc 然后仅过滤列出完整的交易,其中 x 是交易的一部分【英文标题】:GA BigQuery - Users who bought product x also bought products abc then filter only list complete transacitons where x was part of a transaction 【发布时间】:2016-05-12 11:14:16 【问题描述】:以下 BigQuery SQL 将检索为购买名为“Elephant”且类别为“Animals”的客户 (fullVisitorId) 购买的所有其他产品。
现在问题来了。如果同一客户 (fullVisitorId) 在同一日期范围内下达两个订单。假设他或她在一次交易中购买了一种名为“Tiger”的产品以及其他产品,那么如果他或她在购买 Elephant 的同一天之前或之后一天下类似订单,那么 Tiger 和这些产品也会显示为相关产品,因为我的查询使用的是 fullVisitorId。换句话说,一个 fullVisitorId 可以有 1 个或多个 transactionID。一笔交易对于为当前交易购买的每件产品都具有相同的 transactionId。
那么有谁知道我如何在最后进行额外的过滤,以便在购买主要产品 Elephant 时仅显示具有相同 transactionId 的相关产品,而忽略所有其他具有不同 transactionID 的产品?
SELECT hits.product.productSKU AS other_purchased_products_sku,
hits.product.v2ProductName AS other_product_name,
hits.product.v2ProductCategory AS other_prod_category,
COUNT(hits.product.productSKU) AS quantity,
hits.transaction.transactionId AS trans_id,
fullVisitorId
FROM
( SELECT fullVisitorId,
hits.product.productSKU,
hits.eCommerceAction.action_type,
hits.product.v2ProductName,
hits.product.v2ProductCategory,
hits.transaction.transactionId
FROM TABLE_DATE_RANGE([XXXXXX.ga_sessions_], TIMESTAMP('2016-04-1'), TIMESTAMP('2016-04-30')))
WHERE fullVisitorId IN
( SELECT fullVisitorId
FROM TABLE_DATE_RANGE([XXXXXX.ga_sessions_], TIMESTAMP('2016-04-1'), TIMESTAMP('2016-04-30'))
WHERE hits.product.v2ProductCategory CONTAINS 'Animals'
AND hits.product.v2ProductName = 'Elephant'
AND hits.eCommerceAction.action_type = '6'
GROUP BY fullVisitorId)
AND hits.product.v2ProductCategory CONTAINS 'Animals'
AND hits.product.v2ProductName IS NOT NULL
AND hits.product.v2ProductName !='Elephant'
AND hits.eCommerceAction.action_type = '6'
GROUP BY other_purchased_products_sku,
other_product_name,
other_prod_category,
trans_id,
fullVisitorId
ORDER BY trans_id DESC;
【问题讨论】:
【参考方案1】:希望这是您需要的:
SELECT
a.fv fv,
a.sku sku,
a.name name,
a.category category,
a.qtd qtd,
a.tid tid
FROM(
SELECT
fullvisitorid fv,
visitid v,
hits.product.productsku sku,
hits.product.v2productname name,
hits.product.v2productcategory category,
COUNT(hits.product.productsku) qtd,
hits.transaction.transactionid tid
FROM (table_date_range([XXXXXXX.ga_sessions_], timestamp("20160501"), timestamp("20160501"))),
(table_date_range([XXXXXXXX.ga_sessions_intraday_], timestamp("20160501"), timestamp("20160501")))
WHERE 1 = 1
and hits.ecommerceaction.action_type = '6'
GROUP EACH BY fv, v, sku, name, category, tid
) a
INNER JOIN EACH(
SELECT
fullvisitorid fv,
visitid v,
hits.product.productsku sku,
hits.product.v2productname name,
hits.product.v2productcategory category,
hits.transaction.transactionid tid
FROM (table_date_range([XXXXXXXX.ga_sessions_], timestamp("20160501"), timestamp("20160501"))),
(table_date_range([XXXXXXXX.ga_sessions_intraday_], timestamp("20160501"), timestamp("20160501")))
WHERE 1 = 1
and hits.ecommerceaction.action_type = '6'
and lower(hits.product.v2productcategory) contains "animals"
and lower(hits.product.v2productname) contains "elephant"
GROUP EACH BY fv, v, sku, name, category, tid
) b
on a.fv = b.fv and a.tid = b.tid
分解:
首先查询组b
:
SELECT
fullvisitorid fv,
visitid v,
hits.product.productsku sku,
hits.product.v2productname name,
hits.product.v2productcategory category,
hits.transaction.transactionid tid
FROM (table_date_range([XXXXXXXX.ga_sessions_], timestamp("20160501"), timestamp("20160501"))),
(table_date_range([XXXXXXXX.ga_sessions_intraday_], timestamp("20160501"), timestamp("20160501")))
WHERE 1 = 1
and hits.ecommerceaction.action_type = '6'
and lower(hits.product.v2productcategory) contains "animals"
and lower(hits.product.v2productname) contains "elephant"
GROUP EACH BY fv, v, sku, name, category, tid
此查询首先将检索您想要的fullvisitorids
和transactionids
以及类别animals
和名称elephant
。
然后在查询组a
:
SELECT
fullvisitorid fv,
visitid v,
hits.product.productsku sku,
hits.product.v2productname name,
hits.product.v2productcategory category,
COUNT(hits.product.productsku) qtd,
hits.transaction.transactionid tid
FROM (table_date_range([XXXXXXX.ga_sessions_], timestamp("20160501"), timestamp("20160501"))),
(table_date_range([XXXXXXXX.ga_sessions_intraday_], timestamp("20160501"), timestamp("20160501")))
WHERE 1 = 1
and hits.ecommerceaction.action_type = '6'
GROUP EACH BY fv, v, sku, name, category, tid
您检索所有fullvisitorids
,他们的transactions
和通讯员products
。
使用内部连接只保留您感兴趣的交易(在给定交易中购买类别“动物”并命名为“大象”的完整访问者)。
我希望这会有所帮助。有任何问题请告诉我,
【讨论】:
您好 Will,感谢您解决问题并提供高质量的解释。你也知道我可以如何添加两个额外的列。 transaction_ga:date (YYYYMMDD), transaction_ga:isoWeek_number (1-52(3 如果第 53 周存在?))? 只需将字段date
和week(date)
带入每个组并在这些字段上进行连接。
这也有效。再次感谢您对此的支持。
完成了。找不到按钮:)
您好,您知道如何确保星期(日期)生成 ISO 8601 周数(星期从星期一开始)吗?以上是关于GA BigQuery - 购买产品 x 的用户也购买了产品 abc 然后仅过滤列出完整的交易,其中 x 是交易的一部分的主要内容,如果未能解决你的问题,请参考以下文章
在 GA360 Bigquery 数据中,用户访问如何分解为 GA360 会话?
Bigquery 中新安装的购买者群组的 Firebase 事件
在 BigQuery 中回填 Google Analytics