は
#standardSQL
SELECT
person, yearMonth, CAST(amount AS INT64) amount
FROM (
SELECT
person, yearMonth, dt,
AVG(amount) OVER(PARTITION BY person ORDER BY dt RANGE BETWEEN 63 PRECEDING AND CURRENT row) amount,
COUNT(1) OVER(PARTITION BY person ORDER BY dt RANGE BETWEEN 63 PRECEDING AND CURRENT row) months
FROM (
SELECT
person, amount, yearMonth,
UNIX_DATE(DATE(DIV(yearMonth, 100), MOD(yearMonth, 100), 1)) AS dt
FROM `project.dataset.table`
)
)
WHERE months = 3
-- ORDER BY person, yearMonth
あなたが/テストダミーでそれで遊ぶことができます(少なくとも適切なグループ化のロジックにあなたのアイデアを与える必要があります)BigQueryの標準SQLのためであります
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'AA' person, 100 amount, 201701 yearMonth UNION ALL
SELECT 'AA', 200, 201702 UNION ALL
SELECT 'AA', 300, 201703 UNION ALL
SELECT 'AA', 70, 201704 UNION ALL
SELECT 'AB', 10, 201701 UNION ALL
SELECT 'AB', 50, 201702 UNION ALL
SELECT 'AB', 60, 201703 UNION ALL
SELECT 'AB', 70, 201704 UNION ALL
SELECT 'AC', 70, 201701 UNION ALL
SELECT 'AC', 80, 201702 UNION ALL
SELECT 'AC', 30, 201703 UNION ALL
SELECT 'AC', 10, 201704
)
SELECT
person, yearMonth, CAST(amount AS INT64) amount
FROM (
SELECT
person, yearMonth, dt,
AVG(amount) OVER(PARTITION BY person ORDER BY dt RANGE BETWEEN 63 PRECEDING AND CURRENT row) amount,
COUNT(1) OVER(PARTITION BY person ORDER BY dt RANGE BETWEEN 63 PRECEDING AND CURRENT row) months
FROM (
SELECT
person, amount, yearMonth,
UNIX_DATE(DATE(DIV(yearMonth, 100), MOD(yearMonth, 100), 1)) AS dt
FROM `project.dataset.table`
)
)
WHERE months = 3
ORDER BY person, yearMonth
以下の期待通りの出力が
person yearMonth amount
AA 201703 200
AA 201704 190
AB 201703 40
AB 201704 60
AC 201703 60
AC 201704 40
0であるとしてデータ
BigQueryのレガシーSQL
#legacySQL
SELECT
person, yearMonth, INTEGER(amount) amount
FROM (
SELECT
person, yearMonth, dt,
AVG(amount) OVER(PARTITION BY person ORDER BY dt range BETWEEN 63*60*60*24 preceding AND current row) amount,
COUNT(1) OVER(PARTITION BY person ORDER BY dt range BETWEEN 63*60*60*24 preceding AND current row) months
FROM (
SELECT
person, amount, yearMonth,
TIMESTAMP_TO_SEC(TIMESTAMP(CONCAT(STRING(INTEGER(yearMonth/100)), '-', SUBSTR(STRING(100 + yearMonth % 100), 2, 2), '-01'))) AS dt
FROM [project:dataset.table]
)
)
WHERE months = 3
-- ORDER BY person, yearMonth
ため
追加バージョンあなたがテストすることができます/ダミーデータ
#legacySQL
SELECT
person, yearMonth, INTEGER(amount) amount
FROM (
SELECT
person, yearMonth, dt,
AVG(amount) OVER(PARTITION BY person ORDER BY dt range BETWEEN 63*60*60*24 preceding AND current row) amount,
COUNT(1) OVER(PARTITION BY person ORDER BY dt range BETWEEN 63*60*60*24 preceding AND current row) months
FROM (
SELECT
person, amount, yearMonth,
TIMESTAMP_TO_SEC(TIMESTAMP(CONCAT(STRING(INTEGER(yearMonth/100)), '-', SUBSTR(STRING(100 + yearMonth % 100), 2, 2), '-01'))) AS dt
FROM -- [project:dataset.table]
(SELECT 'AA' person, 100 amount, 201701 yearMonth),
(SELECT 'AA' person, 200 amount, 201702 yearMonth),
(SELECT 'AA' person, 300 amount, 201703 yearMonth),
(SELECT 'AA' person, 70 amount, 201704 yearMonth),
(SELECT 'AB' person, 10 amount, 201701 yearMonth),
(SELECT 'AB' person, 50 amount, 201702 yearMonth),
(SELECT 'AB' person, 60 amount, 201703 yearMonth),
(SELECT 'AB' person, 70 amount, 201704 yearMonth),
(SELECT 'AC' person, 70 amount, 201701 yearMonth),
(SELECT 'AC' person, 80 amount, 201702 yearMonth),
(SELECT 'AC' person, 30 amount, 201703 yearMonth),
(SELECT 'AC' person, 10 amount, 201704 yearMonth)
)
)
WHERE months = 3
ORDER BY person, yearMonth
で例の下に使用してそれで遊ぶあなたも、あなたのビューを移行支援が必要な場合は、別の質問を投稿考えてみましょう標準のSQLに変換します。 –