将我的计算转换为用户定义的函数

时间:2019-07-01 22:00:07

标签: sql amazon-redshift

我正在尝试将计算结果转换为UDF,但是我不断出错,并且不确定如何纠正它。

代码如下:

CREATE FUNCTION f_q1 (integer) RETURNS integer stable as $$
SELECT COUNT(DISTINCT(CASE WHEN q_1 IN ('8', '9', '10') THEN RESPONSE_ID END))*1.0 / COUNT(DISTINCT(CASE WHEN q_1 IS NOT NULL THEN RESPONSE_ID END))*1.0
$$ language sql;

我基本上是在尝试以下代码:

SELECT
COUNT(DISTINCT(CASE WHEN f.q_1 IN ('8', '9', '10') THEN f.RESPONSE_ID END))*1.0 / COUNT(DISTINCT(CASE WHEN f.q_1 IS NOT NULL THEN f.RESPONSE_ID END))*1.0 AS q_1
FROM FACT f

并将其创建到我可以在整个查询中调用的UDF中。

这是我第一次使用UDF,有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

CREATE FUNCTION f_q1 (integer)表示您正在传递单个整数。因此,您的UDF只能使用该整数来确定其输出。

该函数中没有所谓的q_1,也没有多行输入。它是一个标量UDF ,表示它接受一定数量的输入值并返回单个输出值。

您可以考虑使用Stored Procedure代替标量UDF。

但是,坦率地说,如果您的上述查询有效,请继续使用它。将其放在函数中并没有什么特别的好处。

答案 1 :(得分:0)

当前,Amazon Redshift用户定义的函数仅是标量。它们仅接受单个值参数作为输入,并返回单个输出值。 https://docs.aws.amazon.com/redshift/latest/dg/udf-creating-a-scalar-sql-udf.html

如果您希望封装聚合,例如COUNT(DISTINCT ),则需要使用存储过程。 https://docs.aws.amazon.com/redshift/latest/dg/stored-procedure-overview.html

或者,您可以分别执行COUNT(DISTINCT )并将CASE逻辑封装在两个UDF中。例如:

--Two parameters: q_1 and response_id
CREATE FUNCTION f_key_question(INTEGER,INTEGER) 
RETURNS INTEGER
STABLE AS $$
    SELECT CASE WHEN $1 IN (8,9,10) THEN $2 ELSE NULL END
$$ LANGUAGE SQL
;
CREATE FUNCTION f_any_question(INTEGER) 
RETURNS INTEGER
STABLE AS $$
    SELECT CASE WHEN $1 IS NOT NULL THEN $2 ELSE NULL END
$$ LANGUAGE SQL
;
SELECT COUNT(DISTINCT(f_key_question(f.q_1,f.response_id))::NUMERIC
     / COUNT(DISTINCT(f_any_question(f.q_1,f.response_id))::NUMERIC  AS q_1
FROM fact f
;