【问题标题】:Running Sum for the last 30 days on BigQuery在 BigQuery 上运行过去 30 天的 Sum
【发布时间】:2018-07-17 08:47:23
【问题描述】:

我正在尝试在 BigQuery 中对 Google Merchandise Store 公共数据集进行以下查询:

  1. 日期
  2. 不同用户的数量
  3. 过去 30 天不同用户数的运行总和

例如(为了简单起见,我在示例中使用了 3 天):

  date        distinct_users     distinct_users_3days
15/07/2018          8                    15
14/07/2018          2                    12
13/07/2018          5                    20
12/07/2018          5                    15
11/07/2018         10                    10
   ...

这是我当前获取前两列的 SQL 代码,但我不知道如何获取运行总和:

SELECT
  date,
  COUNT(DISTINCT(fullVisitorId)) as daily_active_user
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_2017*`
WHERE
  _table_suffix BETWEEN "0101"
  AND "0715"
GROUP BY
  date

感谢任何帮助! :)

【问题讨论】:

  • 两个答案都有相当概念性的问题!提示 - 检查使用 ROWS 之间的区别。并且范围超过。如果您在“解决”这个问题上遇到问题,请告诉我,以便我或其他人进一步提供帮助
  • 嗨@Mikhail,去了解更多关于RANGE的信息。据我了解,“RANGE 子句将框架限制为包含其值在指定范围内的行,相对于当前值。”,这是否意味着我们应该使用 RANGE(..BETWEEN 29 PRECEDING AND CURRENT ROW) 代替?来源:sonra.io/2017/08/22/…
  • 你很接近。但你仍然需要学习一点。提示 - 范围对不在行上的值进行操作。在您的示例中使用范围与行的重要性 - 如果您错过了任何一天,您将得到错误的结果,例如 31 天而不是 30 天,等等。
  • 这些是为您提供的几个相关示例 - Count unique ids in a rolling time frameaggregate QUERY - 3 month average per person for every month - 如果他们有帮助,请随时投票 :o)

标签: sql google-bigquery cumulative-sum


【解决方案1】:

我设法找出了我的问题的答案,所以我想与其他可能在未来遇到这个问题的人分享。

SQL代码是:

SELECT
  date,
  COUNT(DISTINCT(fullVisitorId)) as daily_active_user,
  SUM(count(Distinct(fullVisitorId))) OVER (ORDER BY date ROWS BETWEEN 29 PRECEDING AND CURRENT ROW) AS monthly_active_user
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_2017*`,
  unnest(hits) as h
WHERE
  _table_suffix BETWEEN "0101" AND "0715"
GROUP BY
  date

这给出了一个列,它汇总了 30 天窗口中的不同用户。

【讨论】:

  • 您愿意接受您自己的答案吗?供社区将来参考。
  • unnest 函数有什么作用?
【解决方案2】:

请尝试以下查询 3 天 (SQL server 2014 )-:

SELECT date,COUNT(DISTINCT(fullVisitorId)) as daily_active_user,sum(COUNT(DISTINCT(fullVisitorId))) over (PARTITION BY null ORDER BY date desc ROWS 
BETWEEN CURRENT ROW AND 2 FOLLOWING) AS distinct_users_3days FROM YOUR_TABLE_NAME WHERE _table_suffix BETWEEN '0101' AND '715' GROUP BY date

30天-:

SELECT 
date,COUNT(DISTINCT(fullVisitorId)) as daily_active_user,
sum(COUNT(DISTINCT(fullVisitorId))) over (PARTITION BY null ORDER BY date desc ROWS 
BETWEEN CURRENT ROW AND 29 FOLLOWING) AS distinct_users_3days 
FROM YOUR_TABLE_NAME 
WHERE _table_suffix 
BETWEEN '0101' AND '715' 
GROUP BY date

【讨论】:

  • 嗨@IShubh,在 BigQuery 上尝试了您的查询,它运行良好!我还发布了我的查询,因为我找到了自己问题的答案并将其发布在这里以供将来参考。谢谢你的帮助! :)
猜你喜欢
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
相关资源
最近更新 更多