BigQuery:计算每日分区表中的平均值

Posted

技术标签:

【中文标题】BigQuery:计算每日分区表中的平均值【英文标题】:BigQuery: Calculating averages in daily partitioned tables 【发布时间】:2018-02-15 20:28:30 【问题描述】:

我无法从几个分区的每日表中获取平均值。我们每天都有分区表。我想要一个 SQL 查询来计算按国家/地区分组的 N 天的平均请求数。

这是架构:

日期(字符串) 国家(字符串) 请求(整数)

到目前为止我所拥有的:

SELECT country, avg(req) as AvgReq
FROM TABLE_DATE_RANGE([thePartitionedTable_],
DATE_ADD(CURRENT_TIMESTAMP(), -2, 'DAY'), CURRENT_TIMESTAMP())
GROUP BY country

这当然可以使用 1 天,但是当我尝试 2 天或更长时间时,数据会出现偏差。我的逻辑有什么问题?在这种情况下,AVG() 函数如何工作?我也需要按日期分组吗?

所以我想要 thePartitionedTable_today 的每日平均值和 thePartitionedTable_yesterday 的每日平均值,然后如果有意义的话,我想要它们的平均值。因此,如果 thePartitionedTable_today 的尼日利亚日均值为 2,而 ThePartitionedTable_yesterday 的尼日利亚日均值为 3,则尼日利亚这两天的日均值为 2.5。我真的很感谢你的时间!

【问题讨论】:

AVG 获取您所有数据的平均值,例如,如果您在 1 天进行 10 次销售,总计 30 美元,那么您当天的平均值为 3 如果您在第二天进行 2 次销售总计 4 美元是当天的平均 2.83 美元,但总计将是 12 次销售,总计 34 美元,平均为 2.83 美元 啊,所以我假设数据为什么会出现偏差是正确的,所以我确实需要编写一个更好的查询来计算每天的平均值,然后从这些平均值中取平均值。我有一些工作要做,希望有人能提供帮助,但如果我找到它,我一定会在这里发布答案! 我建议尽可能使用standard SQL——如果您有复杂的逻辑,那么使用旧版 SQL 编写会变得更加困难。在这里,您将使用 table wildcard 一次读取多个表。 【参考方案1】:

使用标准 SQL:

with avg_byday AS (
  SELECT
    country,
    AVG(req) AS req_avg
  FROM
    `thePartitionedTable_*`
  GROUP BY
    _TABLE_SUFFIX,
    country)
SELECT
  country,
  AVG(req_avg)
FROM
  avg_byday
GROUP BY
  country

子查询还会为您提供每个国家/地区每天的平均请求数。

【讨论】:

这真的是可读的,而不是我在做什么。甚至不知道“with”语法或与 * 一起使用的 _TABLE_SUFFIX。非常感谢!

以上是关于BigQuery:计算每日分区表中的平均值的主要内容,如果未能解决你的问题,请参考以下文章

检查 Bigquery 分区表中的任何缺失天数记录

有没有办法使用 bigquery API 删除分区表中的旧分区?

收集对日期分区表的查询的每日结果

如何为 Google Bigquery 表创建季度分区 [重复]

BigQuery 中的分区表

在 Bigquery 中的分区表上插入查询