使用 SUM 过滤结果时,Google BigQuery 相关子查询错误

Posted

技术标签:

【中文标题】使用 SUM 过滤结果时,Google BigQuery 相关子查询错误【英文标题】:Google BigQuery correlated subqueries error when filtering results with SUM 【发布时间】:2019-01-07 20:01:46 【问题描述】:

我在 Bigquery 中设置了两个表,用于跟踪 users 和每日 page_views

users
| id | email |

page_views
| user_id | visit_date | visit_path | counter |

子查询效果很好(不聚合时):

SELECT id
FROM myDataset.users
WHERE account_id = 'ACCOUNT_ID'

-- this works great
AND EXISTS(
  SELECT 1
  FROM myDataset.pageviews
  WHERE user_id = users.id
  AND visit_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 WEEK)
  AND visit_path = '/contact'
  AND counter >= 2
  LIMIT 1
)

但是,在创建将 SUM 一段时间内的页面浏览次数的查询时,我看到了错误:

不支持引用其他表的相关子查询,除非它们可以去相关,例如通过将它们转换为有效的 JOIN。

目标是编写这样的查询:

告诉我所有访问过the pricing page 10 times in the last weekthe contact page 1 time in the last dayusers

SELECT id
FROM myDataset.users
WHERE account_id = 'ACCOUNT_ID'

-- Correlated subqueries error
AND EXISTS(
  SELECT SUM(counter) visit_count_total
  FROM myDataset.pageviews
  WHERE user_id = users.id
  AND visit_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 WEEK)
  AND visit_path = '/pricing'
  HAVING visit_count_total >= 10
  LIMIT 1
)

-- Correlated subqueries error
AND EXISTS(
  SELECT SUM(counter) visit_count_total
  FROM myDataset.pageviews
  WHERE user_id = users.id
  AND visit_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
  AND visit_path = '/contact'
  HAVING visit_count_total >= 1
  LIMIT 1
)

LIMIT 100

注意:此查询是从仪表板 UI 生成的,因此它可能有多个过滤条件。

对我来说,如何通过 JOIN 支持具有不同路径/计数的多个子查询并不明显。

【问题讨论】:

【参考方案1】:

由于您想过滤子查询的SUM 大于某个数字,您可以试试这个:

#standardSQL
WITH mytable
AS (
  SELECT *, title account_id, title id, title user_id, views counter
  FROM `fh-bigquery.wikipedia_v3.pageviews_2019` 
  WHERE datehour='2019-01-01 01:00:00' 
  AND wiki='br'
)

SELECT account_id
FROM `mytable` a
WHERE account_id='Avignon'
AND (
    SELECT SUM(counter)
    FROM `mytable` b
    WHERE a.user_id = b.id
) > 10

基本上是一个返回SUM 的子查询,并在外部查询中比较所需的最小值。

【讨论】:

这很好,感谢您提供的示例。拥有公共数据集非常好:)

以上是关于使用 SUM 过滤结果时,Google BigQuery 相关子查询错误的主要内容,如果未能解决你的问题,请参考以下文章

Google表格过滤器使用OR标准

Google BigQuery Sum 返回错误的结果

在 Google 表格中过滤最快和平均时间

Google 放置 getPlaceID 返回非空数组,但过滤器返回零结果

应用电子商务操作过滤器时,Big Query 和 Google Analytics UI 不匹配

sql [BigQuery - Facebook产品目录]查询para obtenerelcatálogodeproductos de Kichink。 #facebook #bigqu