【问题标题】:BigQuery - Moving median calculationBigQuery - 移动中位数计算
【发布时间】:2018-10-04 14:33:28
【问题描述】:

我有这样的月销售额数据

Company  Month    Sales
Adidas   2018-09   100
Adidas   2018-08    95
Adidas   2018-07   120
Adidas   2018-06   155
...and so on

我需要添加另一列,说明 median over the past 12 months(或者如果 12 个月不可用,则与有数据一样多)。

在 Python 中,我想出了如何使用 for 循环来执行此操作,但我不确定如何在 BigQuery 中执行此操作。

谢谢!

【问题讨论】:

    标签: google-bigquery median


    【解决方案1】:

    这是一种可行的方法:

    CREATE TEMP FUNCTION MEDIAN(arr ANY TYPE) AS ((
      SELECT
        IF(
          MOD(ARRAY_LENGTH(arr), 2) = 0,
          (arr[OFFSET(DIV(ARRAY_LENGTH(arr), 2) - 1)] + arr[OFFSET(DIV(ARRAY_LENGTH(arr), 2))]) / 2,
          arr[OFFSET(DIV(ARRAY_LENGTH(arr), 2))]
        )
      FROM (SELECT ARRAY_AGG(x ORDER BY x) AS arr FROM UNNEST(arr) AS x)
    ));
    
    SELECT
      Company,
      Month,
      MEDIAN(
        ARRAY_AGG(Sales) OVER (PARTITION BY Company ORDER BY Month ROWS BETWEEN 11 PRECEDING AND CURRENT ROW)
      ) AS trailing_median
    FROM (
      SELECT 'Adidas' AS Company, '2018-09' AS Month, 100 AS Sales UNION ALL
      SELECT 'Adidas', '2018-08', 95 UNION ALL
      SELECT 'Adidas', '2018-07', 120 UNION ALL
      SELECT 'Adidas', '2018-06', 155
    );
    

    结果是:

    +---------+---------+-----------------+
    | Company |  Month  | trailing_median |
    +---------+---------+-----------------+
    | Adidas  | 2018-06 |           155.0 |
    | Adidas  | 2018-07 |           137.5 |
    | Adidas  | 2018-08 |           120.0 |
    | Adidas  | 2018-09 |           110.0 |
    +---------+---------+-----------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-06
      • 2017-10-12
      • 2019-05-24
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多