使用CASE语句更改基于PARTITION中的一个特定条目的新BigQuery列的值

时间:2014-07-14 23:41:38

标签: google-bigquery

我尝试编写一些case语句,如果在分区内部满足特定条件,则可能会更改调用中所有条目的值。这是具体的背景。想象一下,我有一个使用以下SQL查询创建的特定数据集:

SELECT date, CONCAT(fullVisitorId, STRING(visitId)) AS unique_visit_id, visitId, visitNumber, fullVisitorId, totals.pageviews, totals.bounces, 
LAG(hits.page.pagePath,1) OVER(PARTITION BY unique_visit_id ORDER BY hits.time ASC) as lagged, hits.page.pagePath, hits.page.pageTitle, device.deviceCategory, device.browser, device.browserVersion, hits.customVariables.index,
hits.customVariables.customVarName, hits.customVariables.customVarValue, hits.time
FROM (FLATTEN([XXXXXXXX.ga_sessions_20140711], hits.time))
WHERE hits.customVariables.index = 4
LIMIT 1000;

结果数据集看起来类似于以下内容(以excel显示):

Snapshot showing the data frame

请注意,unique_visit_id对于每次唯一访问都具有相同的编号。在许多情况下我想要做的是运行hits_page_pagePath。我想构造一个CASE语句,使得当滞后URL(使用REGEX_MATCH()找到)等于特定值,并且当hits_time = 0时hits_page_pagePath的值等于某个值,然后使用大小写创建一个新列标记整个分区的特定值。例如,假设我在hits_page_pagePath中发现了一个错误,并且滞后值是某个值。在这种情况下,我会将整个分区标记为“预订错误”。如果错误之前的滞后值是不同的,我会将分区设置为不同的标签,例如“付款错误”。该表格如下所示:

enter image description here

这将对所有unique_visit_id分区重复。然后,我可以将每个分区的总弹跳,命中,事件等计数组合在一起。任何见解将不胜感激!

2 个答案:

答案 0 :(得分:1)

完全有可能通过智能使用分析功能来完成,但我的SQL-fu并不是这样。也就是说,通过简单的JOIN语句听起来就像你想要的那样。让我们说你当前的查询被称为Q(你甚至可以将其保存为视图以使其更容易)。

运行

SELECT t1.*, t2.has_some_property
FROM Q AS t1
LEFT OUTER JOIN (
  SELECT unique_visit_id, 1 as has_some_property
  FROM Q 
  WHERE (REGEXP_MATCH(lagged, ...) 
      AND REGEXP_MATCH(hits.page.pagePath))
  GROUP BY unique_visit_id
  ) AS t2
ON t1.unique_visit_id == t2.unique_visit_id

答案 1 :(得分:1)

如果您正在寻找避免连接,可以使用Over的聚合函数。 类似的东西:

Max(If((Your Condition here),Your value here, Null)) Over( Partition By Your_Partition)

窗口函数曾经有过一些应该在最近得到改进的性能问题。 我对BQ的经历让我更喜欢Jordan的Join建议。但是,嘿,这是一个有趣的谜语......