计算BigQuery的逐月或逐年差异

时间:2019-07-30 04:59:50

标签: google-bigquery

我想在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

谢谢。

1 个答案:

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

enter image description here

-

现在,使用您的示例数据-事实证明您也有不同的商店。您要比较全国总数还是每个商店总数?

对于每个商店的总数,解决方法是:

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

enter image description here