Bigquery:如何根据特定时间范围聚合几列的数据?

Posted

技术标签:

【中文标题】Bigquery:如何根据特定时间范围聚合几列的数据?【英文标题】:Bigquery: How can I aggregate the data of several columns according to a specific time range? 【发布时间】:2020-12-18 04:43:27 【问题描述】:

我是大查询的新手,我正在尝试汇总一系列客户帐户中的交易数据、收入数据和访问者数据。我需要按客户名称和 8 个月的时间段对输出进行分组,因此每个客户帐户都有 12 个月的汇总数据(每月的每一天在一个月的条目中加在一起)。我只能设法从每个月的第一天抽出,而不是两者之间的所有内容加在一起:

SELECT
  clientname,
  DATE_TRUNC(PARSE_DATE('%Y%m%d',date), MONTH) as MonthStart,
  SUM (totals.visits) AS visits,
  SUM (totals.transactions) AS transactions,
  SUM (totals.campaigns) AS campaigns,
  sum (totals.totalTransactionRevenue) AS Transactionsrevenue,
FROM `prod.mar.auto` as automotive
GROUP BY 
   clientname,monthstart
ORDER BY 
   clientname,monthstart ASC
Limit 1000

out 仅提供当月第一天的值,而不是月份之间的总和。有人可以帮我指出正确的方向吗?

谢谢

【问题讨论】:

“我需要将输出按客户名称和 8 个月的周期分组,因此每个客户帐户都有 12 个月的汇总数据”。 . .这对我来说毫无意义。样本数据和期望的结果真的很有帮助——就像一个清晰的解释一样。 【参考方案1】:

部分问题有些不清楚,所以我正在尽力利用我所掌握的信息。

根据我对您问题的理解,整个月的汇总似乎存在问题。它只返回一个月中的一天,而不是整个月的总和。

如果你改变了

DATE_TRUNC(PARSE_DATE('%Y%m%d',date), MONTH) as MonthStart

EXTRACT(MONTH FROM DATE) AS MonthStart

这将返回月份的数字,因此您可以汇总,因为每个月的所有日期字段中的数字都是相同的。

这是最后的查询:

SELECT
  clientname,
EXTRACT(MONTH FROM DATE) AS MonthStart,
  SUM (totals.visits) AS visits,
  SUM (totals.transactions) AS transactions,
  SUM (totals.campaigns) AS campaigns,
  sum (totals.totalTransactionRevenue) AS Transactionsrevenue,
FROM `prod.mar.auto` as automotive
GROUP BY 
   clientname, MonthStart
ORDER BY 
   clientname, MonthStart ASC
Limit 1000

为函数提供文档: https://cloud.google.com/bigquery/docs/reference/standard-sql/date_functions

【讨论】:

嗨,麦迪逊。谢谢您的答复。当我进入 DATEPART 时,它似乎无法识别它? @MarylinMontoya 我意识到我给了你 SQL Server 语法。我刚刚更新了 Big Query 中的等价物 :)【参考方案2】:

如果您想要过去 8 或 12 个月的数据,请使用 WHERE 子句:

SELECT a.clientname,
       SUM(a.visits) AS visits,
       SUM(a.transactions) AS transactions,
       SUM(a.campaigns) AS campaigns,
       SUM(a.totalTransactionRevenue) AS Transactionsrevenue,
FROM `prod.mar.auto` as a
WHERE PARSE_DATE('%Y%m%d',date >= DATE_ADD(CURRENT_DATE interval -12 months)
GROUP BY clientname
ORDER BY clientname ASC
Limit 1000;

【讨论】:

以上是关于Bigquery:如何根据特定时间范围聚合几列的数据?的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery/标准 SQL:如何使用 sum() 聚合所有列(大约 100 列)?

如何从 BigQuery 获取基于时间的结果?

BigQuery - 具有范围聚合的查询中的重复行

如何编辑我的 postgreSQL 查询以按日期选择几列的最新行

如何根据另一列的聚合得到一列的对应值?

BigQuery:如何获取列中特定字段的值?