是否可以在Google Big Query中进行投影?

时间:2018-04-18 19:24:49

标签: google-bigquery

我有一个查询(由于限制,它正在使用旧版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中尝试做的是什么?

谢谢

1 个答案:

答案 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