我们可以在 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。加入功能有问题吗?你能帮忙再看一遍吗? @桑迪。 . . paramsFROM 子句中派生表的名称。它的定义很好。 我在 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 中创建日期参数?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 iOS 中自定义推送通知的外观吗?

如何在颤动中自定义标签栏宽度?

谁在 wordpress 中自定义媒体 URL?

如何在 CastSDK v3 中自定义 ExpandedControllerActivity

我可以在 properties-local.xml 的“发布”对话框中自定义“发布”按钮的流程吗?

Symfony2 - 在树枝中自定义 form_start 函数