BigQuery - 具有不同 WHERE 参数的嵌套查询?

Posted

技术标签:

【中文标题】BigQuery - 具有不同 WHERE 参数的嵌套查询?【英文标题】:BigQuery - Nested Query with different WHERE parameters? 【发布时间】:2020-09-02 20:41:01 【问题描述】:

我正在尝试按日期获取 user_counts 和 new_user_counts,其中 new_user_counts 由条件定义 WHERE 时间戳日期 event_timestamp = 时间戳日期 user_first_touch_timestamp 而 user_counts 将获取同一日期范围内 user_pseduo_id 字段的不同计数。如何在同一个查询中执行此操作?这是我当前查询的样子。

最终,我希望结果如下:

|Date     | new_user_count |       user_counts |
|20200820 |       X        |                 Y |

这是我在代码第 8 行遇到的错误: 语法错误:函数调用不能应用于此表达式。函数调用需要路径,例如a.b.c() 在 [8:5]

谢谢。

    SELECT
    event_date,
    COUNT (DISTINCT(user_pseudo_id)) AS new_user_counts FROM
    `my-google-analytics-table-name.*`
    WHERE DATE(TIMESTAMP_MICROS(event_timestamp)) = 
    DATE(TIMESTAMP_MICROS(user_first_touch_timestamp))
    AND event_date BETWEEN '20200820' AND '20200831'
    (SELECT
    COUNT (DISTINCT(user_pseudo_id)) AS user_counts 
    FROM `my-google-analytics-table-name.*`
    WHERE event_date BETWEEN '20200820' AND '20200831'
    )
    GROUP BY event_date
    ORDER BY event_date ASC

【问题讨论】:

请提供Minimal, Reproducible Example,您当前的查询有什么“错误”?它会产生错误的结果还是...???请提供更多详细信息 谢谢,米哈伊尔。我现在用错误语法错误更新了线程:函数调用无法应用于此表达式。函数调用需要路径,例如a.b.c() 在 [8:5] 【参考方案1】:

在下面尝试(仅基于您的原始查询,只是修复语法/逻辑)

SELECT
  event_date,
  COUNT(DISTINCT IF(
    DATE(TIMESTAMP_MICROS(event_timestamp)) = DATE(TIMESTAMP_MICROS(user_first_touch_timestamp)), 
    user_pseudo_id, 
    NULL
  )) AS new_user_counts, 
  COUNT(DISTINCT(user_pseudo_id)) AS user_counts 
FROM `my-google-analytics-table-name.*`
GROUP BY event_date
ORDER BY event_date ASC

【讨论】:

谢谢,米哈伊尔。我用两个显示字段不同格式的屏幕截图更新了问题。您刚刚发布的修改后的查询可用于按日期提取新用户数。在我的原始查询中,查询的嵌套部分想要提取相同日期的总用户数,然后显示三列:日期/新用户数/总用户数 查看更新的答案 - 我想我修复了您的查询以产生预期的结果 谢谢,米哈伊尔。那行得通。我希望您不介意后续问题,但我想知道相同的查询是否也适用于 CASE 函数?如果是,与 CASE 相比,当前结构的优势是什么?感谢您对 SO 的帮助。 很难在评论中回答并且没有详细信息 - 请发布包含所有相关详细信息的新问题,我会回答

以上是关于BigQuery - 具有不同 WHERE 参数的嵌套查询?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

具有集群和分区的表上的 Bigquery SQL 性能问题

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

BigQuery 用于记录具有不同属性的不同类型的事件

BigQuery 将 rank / percent_rank 应用于带有 WHERE 子句的列