如何在 BigQuery 中获取每天的累积记录

Posted

技术标签:

【中文标题】如何在 BigQuery 中获取每天的累积记录【英文标题】:How to get cumulative record per day in BigQuery 【发布时间】:2020-02-01 10:29:35 【问题描述】:

我有一个数据如下。

|-----------|-------------|---------------|
|order_date | customer_id | product_id    |
|-----------|-------------|---------------|
|2020-01-01 | 123456      | 0001          |
|-----------|-------------|---------------|
|2020-01-02 | 123456      | 0005          |
|-----------|-------------|---------------|
|2020-01-03 |123456       | 0010          |
|-----------|-------------|---------------|

然后我想像这样每天累积product_id。

|-----------|-------------|----------------------------|
|order_date |customer_id  |count_cumulative_product_id |
|-----------|-------------|----------------------------|
|2020-01-01 |123456       |1                           |
|-----------|-------------|----------------------------|
|2020-01-02 |123456       |2                           |
|-----------|-------------|----------------------------|
|2020-01-03 |123456       |3                           |         
|-----------|-------------|----------------------------|

我不知道什么样的查询可以解决这个问题......

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT *, 
  COUNT(1) OVER(PARTITION BY customer_id ORDER BY order_date) count_cumulative_product_id
FROM `project.dataset.table`

您可以使用您问题中的示例数据进行测试,使用上面的示例,如下例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '2020-01-01' order_date, 123456 customer_id, '0001' product_id UNION ALL
  SELECT '2020-01-02', 123456, '0005' UNION ALL
  SELECT '2020-01-03', 123456, '0010' 
)
SELECT *, 
  COUNT(1) OVER(PARTITION BY customer_id ORDER BY order_date) count_cumulative_product_id
FROM `project.dataset.table`
-- ORDER BY order_date   

结果

Row order_date  customer_id product_id  count_cumulative_product_id  
1   2020-01-01  123456      0001        1    
2   2020-01-02  123456      0005        2    
3   2020-01-03  123456      0010        3

【讨论】:

非常感谢。这可以用于有很多行的表吗? 当然。当然。分析功能非常有效 成功了。非常感谢!【参考方案2】:

如果您不担心distinct product_ids 的累积计数,那么您可以简单地使用“移动窗口”方法:

select 
   order_date,
   customer_id,
   count(product_id) over (order by product_id range between unbounded preceding and current row) as cumulative_product_ids
from `dataset.table`

但是,如果你想要不同 product_ids 的累积计数,那么你可以使用类似的东西:

select order_date, customer_id, count(distinct x) as cumulative_product_ids from ( 
   select 
      order_date, 
      customer_id, 
      array_agg(product_id) over (order by product_id range between unbounded preceding and current row) as cumulative_product_ids
from `dataset.table`
), unnest(cumulative_product_ids) as x
group by 1,2

希望对你有帮助。

【讨论】:

非常感谢。我已经尝试过了,我的数据集大约是 300MB,但是运行了 2 个多小时......所以我不得不放弃...... 300megs 应该不是问题。

以上是关于如何在 BigQuery 中获取每天的累积记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BigQuery 中获取文件加载插入失败的插入记录

如何在 BigQuery 数据访问日志中记录自定义信息?

如何对 BigQuery 表进行分片?

如何根据用户输入参数从 BigQuery 获取结果

如何从 BigQuery 中的 Firebase 事件中获取用户表?

BigQuery:如何执行滚动时间戳窗口组计数,每天产生行