我们可以在 BigQuery 中自定义函数吗?如何在 BigQuery 中创建日期参数?
Posted
技术标签:
【中文标题】我们可以在 BigQuery 中自定义函数吗?如何在 BigQuery 中创建日期参数?【英文标题】:Can we self define a function in BigQuery? How to create a date parameter in BigQuery? 【发布时间】:2021-08-14 01:26:34 【问题描述】:我正在尝试计算我的部门在一段时间内的流动率。例如,我想知道 01/01/2021 - 05/01/2021 的营业额,样本数据是这样的:
UK Status HireDate TermDate
BUV0060 TRM 01/23/2007 12/2/2015
BUV0098 TRM 11/13/2002 2/17/2017
BUV0439 TRM 04/17/2017 2/5/2018
202758 ACT 06/03/1996
17033 TRM 07/01/2019 6/11/2020
92121 ACT 02/24/2020
211343 ACT 04/11/2005
那么我的代码会是这样的:
SELECT *,
Terms /((startheadcount + EndHeadcount) / 2) AS turnover
FROM
(
SELECT
sum(
(
CASE WHEN HireDate < '2021-01-01'
AND TermDate >= '2020-05-01'
OR HireDate < '2021-01-01'
AND TermDate IS NULL THEN 1 ELSE 0 END
)
) as startheadcount,
sum(
(
CASE WHEN HireDate >= '2021-01-01'
AND HireDate <= '2021-05-01' THEN 1 ELSE 0 END
)
) as NewHires,
sum(
(
CASE WHEN TermDate >= '2020-01-01'
AND TermDate <= '2020-05-01' THEN 1 ELSE 0 END
)
) as Terms,
sum(
(
CASE WHEN HireDate < '2021-05-01'
AND TermDate >= '2020-05-01'
OR Status = "ACT" THEN 1 ELSE 0 END
)
) as EndHeadcount
FROM
`XXX.Turnover.Test`
)
结果:
startheadcount NewHires Terms EndHeadcount turnover
4718 231 221 4698 0.046941376380628716
只是想让我的生活更轻松,我不想每次都输入日期范围。那么我们可以定义一个只要求我输入一次日期的函数,然后下面的代码就会自动运行吗?
谢谢!!
根据戈登的回答,它显示:
【问题讨论】:
请提供样本数据和所需的输出 刚刚添加。谢谢! 【参考方案1】:你不需要函数。您可以在派生表中添加参数。我会推荐COUNTIF()
:
SELECT *,
Terms /((startheadcount + EndHeadcount) / 2) AS turnover
FROM (SELECT COUNTIF( t.HireDate < params.DateStart AND
(t.TermDate >= params.DateEnd OR t.TermDate IS NULL)
) as startheadcount,
COUNTIF(t.HireDate >= params.DateStart AND
t.HireDate <= params.DateEnd
) as NewHires,
COUNTIF(t.TermDate >= params.DateStart AND
t.TermDate <= params.DateEnd
) as Terms,
COUNTIF( t.HireDate < params.DateStart AND
t.TermDate >= params.DateEnd OR
t.Status = 'ACT'
) as EndHeadcount
FROM `XXX.Turnover.Test` t CROSS JOIN
(SELECT DATE('2021-05-01') as DateStart,
DATE('2021-05-01') as DateEnd
) params
) t
【讨论】:
嗨,戈登,感谢您的回复。我能理解你的意思。但是当我运行代码时,出现了问题。它说无法识别的名称:params。加入功能有问题吗?你能帮忙再看一遍吗? @桑迪。 . .params
是FROM
子句中派生表的名称。它的定义很好。
我在 Bigquery 中做了,它显示“语法错误”)“但脚本结束”。我能理解你的意思,但代码无法运行......请参阅我在帖子中添加的图片。
@桑迪。 . .我只是错过了您正在使用子查询。一个额外的) t
解决了这个问题。
哇,太棒了。我真的需要再次查看 sql 代码。是时候回学校了……谢谢!【参考方案2】:
直接回答您的问题 - BigQuery supports procedures。
创建一个过程:
CREATE OR REPLACE PROCEDURE amazon.test(input_parameter int64, OUT out1 int64, OUT out2 int64)
BEGIN
SET (out1, out2) = (select as struct input_parameter, 2 * input_parameter);
END;
调用过程:
DECLARE col1, col2 INT64;
CALL amazon.test(5, col1, col2);
SELECT col1, col2
【讨论】:
以上是关于我们可以在 BigQuery 中自定义函数吗?如何在 BigQuery 中创建日期参数?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 CastSDK v3 中自定义 ExpandedControllerActivity