Google BigQuery是否支持投影操作?Legacy SQL滚动平均查询咨询
Google BigQuery Legacy SQL中的投影操作与滚动平均值实现
当然可以在Google BigQuery的Legacy SQL中执行投影操作啦——你写的查询其实已经在做投影了,SELECT子句里指定返回的id、date、sales以及计算出的projected_sale列就是投影的典型应用,投影本质就是从数据表中选择需要返回的字段或计算结果嘛。
接下来聊聊你写的滚动平均值查询,结合你提供的tableA数据,我们可以拆解下逻辑和结果:
你的查询逻辑
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
PARTITION BY id:按id分组计算,确保每个id的滚动平均值独立计算ORDER BY date:按日期排序,保证窗口内的数据是按时间顺序排列的RANGE BETWEEN 4 PRECEDING AND 1 PRECEDING:指定窗口范围是当前日期的前4天到前1天(不过这里有个小细节需要注意,后面会提到)
结合示例数据的计算结果
根据你提供的tableA数据,执行该查询后会得到如下结果:
| id | date | sales | projected_sale |
|---|---|---|---|
| 1 | 01-01-17 | 5 | NULL |
| 1 | 01-02-17 | 6 | 5.0 |
| 1 | 01-03-17 | 7 | 5.5 |
| 1 | 01-04-17 | 10 | 6.0 |
关于窗口范围的小修正
你提到要计算“过去3天(不包含当日)”的滚动平均值,当前的RANGE BETWEEN 4 PRECEDING AND 1 PRECEDING在你的示例数据里刚好得到3天的数据(因为没有更早的记录),但如果数据表中有更早的日期,这个范围会包含前4天的数据。更精确的写法应该是:
SELECT id, date, sales, AVG(sales) OVER (PARTITION BY id ORDER BY date RANGE BETWEEN 3 PRECEDING AND 1 PRECEDING) AS projected_sale FROM tableA
这样就能严格限定为当前日期的前3天到前1天,刚好覆盖过去3天(不含当日)的范围。
另外要注意:确保你的date字段是DATE类型,如果是字符串类型,RANGE的计算会基于字符串的排序规则,可能导致范围判断错误,建议先将字符串日期转换为DATE类型(比如用PARSE_DATE('%d-%m-%y', date))。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

