如何在 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】:您已正确设置表 days
和 sales
的左连接,但您的 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 中生成日期系列并为缺失的销售数据填充零的主要内容,如果未能解决你的问题,请参考以下文章