如何在 BigQuery 中生成日期系列并为缺失的销售数据填充零

Posted

技术标签:

【中文标题】如何在 BigQuery 中生成日期系列并为缺失的销售数据填充零【英文标题】:How to generate date series in BigQuery and fill zeros for missing sales data 【发布时间】:2021-04-09 12:39:37 【问题描述】:

我尝试了几种方法来获得以下所需的输出

date         | sales
-------------+------
2021-04-01   |   128
-------------+------
2021-04-02   |   0
-------------+------
2021-04-03   |   234
-------------+------
2021-04-04   |   188
-------------+------
2021-04-05   |   432
-------------+------
2021-04-06   |   262
-------------+------
2021-04-07   |   0
-------------+------

起初我在 BigQuery 中生成了一个表 days,它具有以下架构

day
-------------+------
2021-04-01
-------------+------
2021-04-02
-------------+------
2021-04-03
-------------+------
2021-04-04
-------------+------
2021-04-05
-------------+------
2021-04-06
-------------+------
2021-04-07
-------------+------

我的销售表具有以下架构

transaction_id  STRING  
location_id STRING  
date_local  TIMESTAMP   

date_local                     |     transaction_id                     |  location_id
-------------------------------+----------------------------------------+---------------
2021-04-01 13:02:58 UTC        |   55a99f8d-c9fe-4aa0-8a1f-9b193369883a | 164
-------------------------------+----------------------------------------+---------------
2021-04-03 21:22:27 UTC        |   19518c8d-9a6b-46a6-a509-81b4452fe94f | HARBOR1
-------------------------------+----------------------------------------+---------------
2021-04-04 05:17:10 UTC        |   220419a8-8cf9-4404-9394-f341a394fb10 | 5513
-------------------------------+----------------------------------------+---------------

我试过这个查询

SELECT day,count(transaction_id) as sales FROM days AS A
LEFT JOIN sales AS B
ON A.day = DATE(B.date_local)
WHERE DATE(B.date_local) BETWEEN "2021-04-01" AND CURRENT_DATE() AND location_id = '164' GROUP BY day ORDER BY day 

但仍然得到这样的结果

day            sales
-------------+------
2021-04-01   |  1
-------------+------

四月的所有其他日期都不见了。

在我离开加入销售表后,我假设销售列的值为 NULL。

我完全走错了吗?如果有人可以帮助我,那就太好了。

【问题讨论】:

【参考方案1】:

您已正确设置表 dayssales 的左连接,但您的 where 部分将仅根据销售表 (B.date_local) 中的日期过滤行。如果当天没有销售交易,则该日期将为空。

更改您的 where 部分以从 days-table 过滤 day -field。这至少会给您的结果带来零销售额的日子。更改后的 where 子句将是这样的:

...
WHERE DATE(A.day) BETWEEN "2021-04-01" AND CURRENT_DATE() ...

【讨论】:

【参考方案2】:

尝试删除 AND location_id = '164'

【讨论】:

这行不通,因为我需要按 location_id 过滤并试图得到这种类型的结果day location_id sales ----------------+---------------+--------- 2021-04-01 | 164 | 1 ----------------+---------------+--------- 2021-04-02 | 164 | 0 ----------------+---------------+--------- 2021-04-03 | 164 | 0 ----------------+---------------+--------- 2021-04-04 | 164 | 0 ----------------+---------------+--------- 2021-04-05 | 164 | 3 ----------------+---------------+--------

以上是关于如何在 BigQuery 中生成日期系列并为缺失的销售数据填充零的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中生成一列随机日期

如何在 google BigQuery 中填写缺失的日期

在 HIVE 中生成日期系列时,将有效日期限制为今天

从表中的开始日期和结束日期在 Postgres 中生成系列

如何使用现有时间戳在 BigQuery 中生成未嵌套的数组

在 PostgreSQL 中生成两个日期之间的时间序列