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 API 删除分区表中的旧分区?