【问题标题】:How create a calculated column in google bigquery?如何在 google bigquery 中创建计算列?
【发布时间】:2019-08-14 19:38:01
【问题描述】:

我在 Google Bigquery 中有这样的数据

        id      yearmonth value
    00007BR0011 201705     8.0   
    00007BR0011 201701     3.0

我需要创建一个表,其中每个 id 显示按年份的减法,以便创建类似的东西

id           value
00007BR0011  5

值5是201705减去201701的值

我正在使用标准 SQL,但不知道如何使用计算创建列。

如果它太基本,请提前抱歉,但还没有找到任何有用的东西。

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    也许单个表/结果集可以满足您的目的:

    select id,
           (max(case when yearmonth = 201705 then value end) -
            max(case when yearmonth = 201701 then value end) -
           )
    from t
    where yearmonth in (201705, 201701)
    group by id;
    

    【讨论】:

      【解决方案2】:

      根据当前的详细程度很难回答这个问题,但如果总是从较大的值中减去较小的值(并且两者都不会为空),您可以使用 GROUP BY 以这种方式处理它:

      SELECT
        id,
        MAX(value) - MIN(value) AS new_value
      FROM
        `your-project.your_dataset.your_table`
      GROUP BY
        id
      

      从这里,您可以将这些结果保存为新表,或将此查询保存为视图定义(这类似于在基础数据发生变化时动态计算)。

      另一种选择是在表架构下添加一列,然后运行UPDATE 查询来填充它。

      如果较小的值并不总是从较大的值中减去,而是较小的日期才是最重要的(并且总是有两个),另一种方法是使用分析(或 window em>) 函数选择日期最小的值:

      SELECT
        DISTINCT
          id,
          (
            FIRST_VALUE(value) OVER(PARTITION BY id ORDER BY yearmonth DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
            -
            LAST_VALUE(value) OVER(PARTITION BY id ORDER BY yearmonth DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
          ) AS new_value
      FROM
        `your-project.your_dataset.your_table`
      

      因为分析函数对源行进行操作,所以需要DISTINCT 来消除重复行。

      如果可能有两行以上,并且您需要从最新值中减去所有先前的值,您可以这样处理(这对于 NULL 或只有一行也是安全的):

      SELECT
        DISTINCT
          id,
          (
            FIRST_VALUE(value) OVER(PARTITION BY id ORDER BY yearmonth DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
            -
            (
              SUM(value) OVER(PARTITION BY id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
              -
              FIRST_VALUE(value) OVER(PARTITION BY id ORDER BY yearmonth DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
            )
          ) AS new_value
      FROM
        `your-project.your_dataset.your_table`
      

      从技术上讲,您可以通过分组和 ARRAY_AGG 取消引用来做同样的事情,尽管这种方法在较大的数据集上会明显变慢:

      SELECT
        id,
        (
          ARRAY_AGG(value ORDER BY yearmonth DESC)[OFFSET(0)]
          -
          (
            SUM(value)
            -
            ARRAY_AGG(value ORDER BY yearmonth DESC)[OFFSET(0)]
          )
        ) AS new_value
      FROM
        `your-project.your_dataset.your_table`
      GROUP BY
        id
      

      【讨论】:

        猜你喜欢
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-23
        • 2016-12-02
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        相关资源
        最近更新 更多