漏斗旧版SQL过滤器问题 - BigQuery

时间:2017-07-03 14:34:35

标签: sql google-bigquery

我们正在尝试使用脚本为Doug Mackenzie在此处创建链接的Google BigQuery漏斗:http://online-behavior.com/analytics/funnel-analysis
我们的SQL调用遇到了一些问题。

我们正在尝试使用来自hits.customDimensions.index = 20的过滤器,其中值为1.这些值始终存在,因此简单的过滤器(例如在其介绍中用作示例的过滤器)很遗憾是不够的。 过滤器如:
    WHERE hits.customDimensions.index = '20'不过滤我们需要过滤的内容 相反,我们需要(我们想象)这样的事情:

WHERE MAX(IF(hits.customDimensions.index=20,hits.customDimensions.value,NULL)) WITHIN hits as locked= '1'

这就是我们尝试过的方法:

FROM (
    SELECT
      fullVisitorId,
      visitId,
      MIN(hits.hitNumber) AS firstHit,
      MAX(IF(hits.isExit, 1, 0)) AS exit
    FROM(
      SELECT
      *,
      MAX(IF(hits.customDimensions.index=20,hits.customDimensions.value,NULL)) WITHIN hits as locked,
      FROM
      TABLE_DATE_RANGE([[dataset.ga_sessions_], TIMESTAMP('2017-06-01'), TIMESTAMP('2017-06-04'))
      )
    WHERE
      REGEXP_MATCH(hits.page.pagePath, '^/plus/.*/[0-9]')
      AND totals.visits = 1
      AND locked= '1'
    GROUP BY
      fullVisitorId,
      visitId) s0

返回错误:
错误:无法查询重复字段customDimensions.index和hits.kunde的叉积。 ;无法查询重复字段customDimensions.value和hits.kunde的交叉积。

我们已经看到有一些建议可以使用FLATTEN解决上述错误的问题。但是,这似乎给出了语法错误:

  FROM (
    SELECT
      fullVisitorId,
      visitId,
      MIN(hits.hitNumber) AS firstHit,
      MAX(IF(hits.isExit, 1, 0)) AS exit,
      MAX(IF(hits.customDimensions.index=20,hits.customDimensions.value,NULL)) WITHIN hits AS locked
    FROM
      FLATTEN(TABLE_DATE_RANGE([[dataset.ga_sessions_], TIMESTAMP('2017-06-01'), TIMESTAMP('2017-06-04')),hits.customDimension)
    WHERE
      REGEXP_MATCH(hits.page.pagePath, '^/plus/.*/[0-9]')
      AND totals.visits = 1
      AND locked = '1'
    GROUP BY
      fullVisitorId,
      visitId) s0 

只是提出错误:Error: Not found: Table eb-bigquery:3917183.ga_sessions_
因此,我们非常感谢任何有关如何使过滤器工作的建议。

1 个答案:

答案 0 :(得分:2)

自撰写此博客以来,BigQuery已经发展了很多,现在我们有更先进的技术来处理数据。

这就是我问你是否可以使用标准版BigQuery的主要原因,因为解决这个问题会更容易。例如:

SELECT 
  fullvisitorid,
  visitid,
  (select min(hitNumber) from unnest(hits) where regexp_contains(page.pagePath, r'^/plus/.*/[0-9]')) firstHit,
  (select max(isExit) from UNNEST(hits) where regexp_contains(page.pagePath, r'^/plus/.*/[0-9]')) exitFlag
FROM `table`
WHERE 1 = 1
  AND EXISTS(select 1 from unnest(hits) where regexp_contains(page.pagePath, r'^/plus/.*/[0-9]'))
AND EXISTS(select 1 from unnest(hits) hits where (select count(value) from unnest(hits.customDimensions) custd where index=20) > 0)
AND totals.visits = 1

此查询执行相同的操作并且比Legacy运行得更快,因为它避免首先取消所有重复的字段然后处理数据。