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

问题描述 投票:1回答:1

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

我必须在工作环境中使用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的日期将是动态的从一行到另一行。任何人都可以指导我如何做到这一点?这似乎是经常出现的事情。

sql google-analytics google-bigquery
1个回答
0
投票

我没有特别熟悉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
© www.soinside.com 2019 - 2024. All rights reserved.