我正在尝试将计算结果转换为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,有人可以帮我解决这个问题吗?
答案 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
;