如何在 google bigquery 中创建计算列?

Posted

技术标签:

【中文标题】如何在 google bigquery 中创建计算列?【英文标题】:How create a calculated column in 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,但不知道如何使用计算创建列。

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何在 google bigquery 中创建计算列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Bigquery 中创建动态更改数据集的查询?

如何在 bigquery 中创建分区表

如何对一系列数据进行分组以在 GOOGLE BigQuery 中创建一个类别

在 Google BigQuery 中创建 CSV 表的困难

保存视图无法在 Google BigQuery 中创建有效的输出架构

在 BigQuery 中创建 Google Analytics“回访用户”指标时出现问题