我有一个查询(由于限制,它正在使用旧版SQL),它产生的列是最近3天销售的滚动平均值(今天除外)
SELECT
id, date, sales, AVG(sales) OVER (PARTITION BY id ORDER BY date RANGE BETWEEN 4 PRECEDING AND 1 PRECEDING) AS projected_sale
FROM tableA
表A
+-------+---------+---------+
| id | date | sales |
+-------+---------+---------+
| 1 | 01-01-17| 5 |
| 1 | 01-02-17| 6 |
| 1 | 01-03-17| 7 |
| 1 | 01-04-17| 10 |
+-------+---------+---------+
查询生成
+-------+---------+---------+--------------+
| id | date | sales |projected_sale|
+-------+---------+---------+--------------+
| 1 | 01-01-17| 5 | . |
| 1 | 01-02-17| 6 | . |
| 1 | 01-03-17| 7 | . |
| 1 | 01-04-17| 10 | 6 |
+-------+---------+---------+--------------+
由于平均值不包括当前行,理论上我可以使用(01-02到01-04)的销售预测01-05-17的销售。但是,由于tableA实际上没有日期为01-05-17的条目,因此我的查询将在01-04-17作为最后一行停止。
我在Big Query中尝试做的是什么?
谢谢
答案 0 :(得分:2)
首先,我认为在这里使用RANGE
不正确 - 应该是ROWS
而不是
无论如何,下面是BigQuery Legacy SQL的一个示例,它演示了如何获得所需的结果。
#legacySQL
SELECT
id, dt, sales,
AVG(sales) OVER (
PARTITION BY id ORDER BY dt
ROWS BETWEEN 4 PRECEDING AND 1 PRECEDING
) AS projected_sale
FROM tableA, (SELECT 1 id, '01-05-17' dt, 0 sales)
正如您在这里看到的那样,您只需在缺少的日子添加(UNION ALL - 逗号在Kegacy SQL中)。当然,您可以对其进行转换,以便为所有id
添加此类缺失行Nevetherless - 希望这是一个很好的起点
您可以使用您的问题中的虚拟数据来测试/播放
#legacySQL
SELECT
id, dt, sales,
AVG(sales) OVER (
PARTITION BY id ORDER BY dt
ROWS BETWEEN 4 PRECEDING AND 1 PRECEDING
) AS projected_sale
FROM (
SELECT * FROM
(SELECT 1 id, '01-01-17' dt, 5 sales),
(SELECT 1 id, '01-02-17' dt, 6 sales),
(SELECT 1 id, '01-03-17' dt, 7 sales),
(SELECT 1 id, '01-04-17' dt, 10 sales)
) tableA, (SELECT 1 id, '01-05-17' dt, 0 sales)
结果为
Row id dt sales projected_sale
1 1 01-01-17 5 null
2 1 01-02-17 6 5.0
3 1 01-03-17 7 5.5
4 1 01-04-17 10 6.0
5 1 01-05-17 0 7.0