BigQuery:在WHERE子句中使用基于当前行中的值的过滤器进行选择

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BigQuery:在WHERE子句中使用基于当前行中的值的过滤器进行选择相关的知识,希望对你有一定的参考价值。

我知道标题可能很愚蠢,但我很难用不同的方式来表达它。

我必须在工作环境中使用BigQuery来获取一些报告。 BigQuery已连接到我们的Google Analytics视图。这给了我们一个每天有1个表的数据集。表的行是我们站点上的用户会话,而列包含有关会话的一些信息。

我遇到的问题如下:我想选择具有事务的会话,但前提是在事务发生前的最后x天内,某个引用者将用户引用到我们的站点。我只熟悉基本的SQL而不是任何高级概念。这对我来说真的很令人沮丧,因为对于任何适当的编程语言而言,如果给出一个.csv的数据,这将是一个明智的选择,但我缺乏SQL中相关概念的知识。

#standardSQL
SELECT
  COUNT(*)
FROM
  `dataset.ga_sessions_2017*`
WHERE 
  totals.transactions > 0 AND
  fullVisitorId IN (SELECT
                        fullVisitorId 
                    FROM 
                        `dataset.ga_sessions_2017*` 
                    WHERE 
                         trafficSource.source = "xyz.com"
                    ) AND
  < date difference thing>

我可以像使用trafficSource(referrer)那样过滤日期差异。对我来说问题是虽然“xyz.com”是一个静态的东西,但我需要引用我所在的当前行的日期值。所以我过滤第二个SELECT的日期将是动态的从一行到另一行。任何人都可以指导我如何做到这一点?这似乎是经常出现的事情。

答案

我没有特别熟悉GA表,但之前在BigQuery中编写了一些wildcard queries,我认为您正在寻找的是可以使用_TABLE_SUFFIX伪列完成的:

CAST(_TABLE_SUFFIX AS INT64) >= 1217

其中1217是今天的MMDD格式减去3天的日期,假设表名是_20171217,_20171218等。否则你可以在转换为int之前使用REPLACE删除下划线。如果您需要自动运行此查询,还有一些函数可以为您生成今天的日期。

此外,我认为fullVisitorId业务可以用简单的WHERE trafficSource.source = "xyz.com"取代,但是如果不能自己运行查询就很难说。

所以完整的查询看起来像这样:

#standardSQL
SELECT
  COUNT(*)
FROM
  `dataset.ga_sessions_2017*`
WHERE 
  totals.transactions > 0 AND
  trafficSource.source = "xyz.com" AND
  CAST(_TABLE_SUFFIX AS INT64) >= 1217

以上是关于BigQuery:在WHERE子句中使用基于当前行中的值的过滤器进行选择的主要内容,如果未能解决你的问题,请参考以下文章

如果我们在 BigQuery 中使用具有相同分区类型(天)的另一列进行过滤,where 子句中的分区列是不是不是必需的?

在 BigQuery 中,带有空值数组列的“where”子句导致问题

是否可以在 Union All BigQuery SQL 中让 where 子句引用另一个 where 子句?

BigQuery 的 WHERE 子句中的 SELECT 语句不起作用

在聚集字段上使用 WHERE 子句运行查询时,Google BigQuery 聚集表不会减少查询大小

python bigquery 库 DB-API 接口如何支持 WHERE IN 或 WHERE ANY 子句