下面是BigQuery标准SQL
如你所见-诀窍在于使用
RANGE
而不是
ROW
#standardSQL
SELECT *,
AVG(val) OVER(
PARTITION BY id, dow
ORDER BY DATE_DIFF(DATE_TRUNC(date, WEEK), DATE_TRUNC(CURRENT_DATE(), WEEK), WEEK)
RANGE BETWEEN 4 PRECEDING AND 1 PRECEDING
) AVG
FROM `project.dataset.table`
你可以使用下面问题中的虚拟数据来测试和玩上面的游戏
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, DATE '2018-01-01' date, 1 dow, 1 val UNION ALL
SELECT 1, '2018-01-08', 1, 2 UNION ALL
SELECT 1, '2018-01-15', 1, 3 UNION ALL
SELECT 1, '2018-01-22', 1, 4 UNION ALL
SELECT 1, '2018-01-29', 1, 5 UNION ALL
SELECT 1, '2018-02-12', 1, 7 UNION ALL
SELECT 1, '2018-02-19', 1, 8 UNION ALL
SELECT 1, '2018-02-26', 1, 9 UNION ALL
SELECT 1, '2018-03-05', 1, 10 UNION ALL
SELECT 1, '2018-03-12', 1, 11 UNION ALL
SELECT 1, '2018-03-19', 1, 12
)
SELECT *,
AVG(val) OVER(
PARTITION BY id, dow
ORDER BY DATE_DIFF(DATE_TRUNC(date, WEEK), DATE_TRUNC(CURRENT_DATE(), WEEK), WEEK)
RANGE BETWEEN 4 PRECEDING AND 1 PRECEDING
) avg
FROM `project.dataset.table`
-- ORDER BY date
结果是
Row id date dow val avg
1 1 2018-01-01 1 1 null
2 1 2018-01-08 1 2 1.0
3 1 2018-01-15 1 3 1.5
4 1 2018-01-22 1 4 2.0
5 1 2018-01-29 1 5 2.5
6 1 2018-02-12 1 7 4.0
7 1 2018-02-19 1 8 5.333333333333333
8 1 2018-02-26 1 9 6.666666666666667
9 1 2018-03-05 1 10 8.0
10 1 2018-03-12 1 11 8.5
11 1 2018-03-19 1 12 9.5