我想在BigQuery中计算基于时间的比较指标,并且不清楚JOIN,LAG,WINDOW中的哪个函数对计算这些通用指标最有效。
我尝试查看为POSTGRES或其他SQL风格编写的其他代码,但它们在BQ中无法正常工作。 LAG的BQ文档在创建新字段时未显示任何计算。
这是我要计算的示例
Date Sales
2019-04-01 100
2019-03-01 80
2019-02-01 60
....
2018-04-01 70
2018-03-01 60
2018-02-01 50
进行逐月比较应创建第三列“ pct_growth”
Date Sales Pct_growth
2019-04-01 100 1.25
2019-04-01 80 1.33
或逐年比较
Date Sales YOY_growth
2019-04-01 100 1.43
2019-03-01 80 1.33
谢谢。
答案 0 :(得分:0)
您可以通过运行自我联接来查找上一个月,以查找等于DATE_ADD(d.date, INTERVAL -1 MONTH)
的日期:
WITH data AS (
SELECT *
FROM UNNEST([
STRUCT(DATE('2018-01-01') AS date, 300 AS sales)
, ('2018-02-01', 200)
, ('2018-03-01', 500)
, ('2018-04-01', 900)
, ('2019-01-01', 100)])
)
SELECT *, ROUND(100*(sales-previous_month)/previous_month,2) pct_growth
FROM (
SELECT *
, (SELECT sales
FROM data
WHERE date=DATE_ADD(d.date, INTERVAL -1 MONTH)
) previous_month
FROM data d
)
WHERE previous_month IS NOT null
ORDER BY date DESC
-
现在,使用您的示例数据-事实证明您也有不同的商店。您要比较全国总数还是每个商店总数?
对于每个商店的总数,解决方法是:
WITH data AS (
SELECT * FROM `public-data-for-testing.sample_data.sample_data_sales`
)
SELECT *, ROUND(100*(sales-previous_month)/previous_month,2) pct_growth
FROM (
SELECT *
, (SELECT sales
FROM data
WHERE date=DATE_ADD(d.date, INTERVAL -1 MONTH)
AND Origin_MSA=d.Origin_MSA
) previous_month
FROM data d
)
WHERE previous_month IS NOT null
ORDER BY date DESC