如何在 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 中创建动态更改数据集的查询?
如何对一系列数据进行分组以在 GOOGLE BigQuery 中创建一个类别
在 Google BigQuery 中创建 CSV 表的困难