【问题标题】:Google BigQuery correlated subqueries error when filtering results with SUM使用 SUM 过滤结果时,Google BigQuery 相关子查询错误
【发布时间】: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 支持具有不同路径/计数的多个子查询并不明显。

【问题讨论】:

    标签: google-bigquery


    【解决方案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 的子查询,并在外部查询中比较所需的最小值。

    【讨论】:

    • 这很好,感谢您提供的示例。拥有公共数据集非常好:)
    猜你喜欢
    • 1970-01-01
    • 2021-09-23
    • 2020-10-05
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多