无法构建有效的 BigQuery CASE 语句

Posted

技术标签:

【中文标题】无法构建有效的 BigQuery CASE 语句【英文标题】:Trouble building an effective BigQuery CASE statement 【发布时间】:2014-07-13 09:31:33 【问题描述】:

我很难为相当复杂的报告查询构建有效的 BigQuery 案例语句。我使用的数据集已由 Google Analytics 填充。对于这个查询,有很多案例,但这是我正在查看的案例之一:

CASE when previous page="^/XXX/[^/]+/apps/booking/flight/traveler\.aspx" and landing page="^/XXX/[^/]+/default\.aspx" then "Traveler info 2.0" 
when previous page="^/web/[^/]+/apps/booking/flight/traveler\.aspx" and landing page="^/web/[^/]+/default\.aspx" then "Traveler info 1.0"  when previous 

这里注意XXX和web是不同的情况。问题在于,需要确定页面路径是否为登录页面,以便处理这些情况。我目前在该领域有一个单独的问题。对于这个特定问题,我查看了许多资源,包括关于 SO 的以下资源,which introduces the BigQuery case function. 为了支持这个问题,这里是将构建的完整案例陈述。

Case when page = "^/XXX/[^/]+/default\.aspx" and landing page="^/XXX/[^/]+/default\.aspx" then "Homepage 2.0" 
when page ="^/web/[^/]+/default\.aspx" and landing page = "^/web/[^/]+/default\.aspx" then "Homepage 1.0" 
when page="^XXX/[^/]+/apps/booking?flight/(searchresult1|search(rt|ow|md))\.aspx" and landing page="^/XXX/[^/]+/default\.aspx" then "Rev inbound search 2.0" 
when page="^web/[^/]+/apps/booking?flight/(searchresult1|search(rt|ow|md))\.aspx" and landing page="^/web/[^/]+/default\.aspx" then "Rev inbound search 1.0" 
when page="^/XXX/[^/]+/apps/booking/flight/searchResult2\.aspx" and previous page ="^XXX/[^/]+/apps/booking?flight/(searchresult1|search(rt|ow|md))\.aspx" and landing page="^/XXX/[^/]+/default\.aspx" then "Rev outbound search 2.0" 
when page="^/web/[^/]+/apps/booking/flight/searchResult2\.aspx" and previous page="^web/[^/]+/apps/booking?flight/(searchresult1|search(rt|ow|md))\.aspx" landing page="^/web/[^/]+/default\.aspx" then "Rev outbound search 1.0" 
when page="^/XXX/[^/]+/apps/booking/flight/reviewRevenue\.aspx" and previous page="^/XXX/[^/]+/apps/booking/flight/searchResult2\.aspx" and landing page="^/XXX/[^/]+/default\.aspx" then "Rev review itinerary 2.0" 
when page="^/web/[^/]+/apps/booking/flight/reviewRevenue\.aspx" and previous page="^/web/[^/]+/apps/booking/flight/searchResult2\.aspx" and landing page="^/web/[^/]+/default\.aspx" then "Rev review itinerary 1.0"  
when page="^/XXX/[^/]+/apps/booking/flight/traveler\.aspx" and previous page="^/XXX/[^/]+/apps/booking/flight/reviewRevenue\.aspx" and landing page="^/XXX/[^/]+/default\.aspx" then "Rev traveler info 2.0" 
when page="^/web/[^/]+/apps/booking/flight/traveler\.aspx" and previous page="^/web/[^/]+/apps/booking/flight/reviewRevenue\.aspx" and landing page="^/web/[^/]+/default\.aspx" then "Rev traveler info 1.0"  
when page="^/XXX/[^/]+/apps/booking/flight/seatSelector\.aspx" and previous page="^/XXX/[^/]+/apps/booking/flight/traveler\.aspx" and landing page="^/XXX/[^/]+/default\.aspx" then "Rev seat selector 2.0" 
when page="^/web/[^/]+/apps/booking/flight/seatSelector\.aspx" and previous page="^/web/[^/]+/apps/booking/flight/traveler\.aspx" and landing page="^/web/[^/]+/default\.aspx" then "Rev seat selector 1.0" 
when page="^/XXX/[^/]+/apps/booking/flight/billingRevenue\.aspx" and previous page="^/XXX/[^/]+/apps/booking/flight/seatSelector\.aspx" and landing page="^/XXX/[^/]+/default\.aspx" then "Rev payment info 2.0" 

我的第一个直觉是创建一个新列(可能),它查看用户采取的路径以确定唯一访问应该属于哪种情况。这可能不是最好的方向,也是我正在探索的方向。另一种是直接使用case函数。对于处理这部分查询的最佳方法,任何最初的支持或见解都是非常出色的。

【问题讨论】:

【参考方案1】:

这取决于您运行查询的频率。 如果是 Ad Hoc 分析,我不会费心创建新字段。 如果您打算经常运行它,我会在填充 BQ 表时创建一个附加字段,并在其中保存一个包含相关信息的短字符串。

关注的不是查询的效率(让 BQ 的人担心这个),而是查询的成本。经常查询具有很长字符串(例如 URL)的字段的成本很高。如果你可以保存一个明显更短的预先计算好的字符串,你可以节省一些钱。

我建议您探索的另一个选项是使用 Regx_Extract 函数解析您的字符串。它可能更具可读性,并且更短一些。 希望这会有所帮助

【讨论】:

谢谢。我现在正在继续取得进展。我的 case 语句正常运行,但正在努力将语句结果复制到与列值(我创建的唯一访问 ID)对应的所有条目。一旦我能做到这一点,我应该处于一个很好的位置。而且,在成本上很重要。目前,报告部分是 Ad Hoc。也就是说,它肯定会很快采用更自动化的方法。 我赞同@N.N 的使用 regexp_extract 的建议。您可以使用子查询从路径中提取有趣的部分,并为它们提供可在外部查询中使用的方便名称。外部查询将更具可读性,更容易修改,并且不太可能出现错误。 这是我卡住的地方。执行 regexp_extract 并将结果应用于与唯一访问对应的所有值的最佳方法是什么。对于上下文,我使用 CONCAT(fullVisitorId, STRING(visitId)) AS unique_visit_id 创建一个唯一的访问 ID。如果其中一个 URL 与我在访问中查找的内容相匹配,那么将此结果转换为对所有唯一访问 ID 具有相同值的新列的最有效方法是什么。 WITHIN 会运作良好吗?我会坚持下去,并在我取得进展时报告结果。 我现在根据查询的进度附加了这个问题,并添加了一个与案例任务相关的新的特定问题(带有特定的假设屏幕截图)。见这里:***.com/questions/24747744/…

以上是关于无法构建有效的 BigQuery CASE 语句的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中将两个查询与 case 语句相结合

无法识别的名称:使用 bigquery 标准 sql 进行嵌套查询时出错

mysql存储函数case语句

在 Bigquery 中有效地取消嵌套值? (选择/案例/其他?)

BigQuery - CASE WHEN x IN(来自其他表的字段),导致半连接错误

BigQuery - 基于字段/过滤器构建动态选择语句/查询