我有一个复杂的查询,它为两个日期(开始日期和结束日期)提供了多行。
现在我想创建一个函数,以便可以为不同的日期组合返回多个行。
CREATE FUNCTION submit_cohort(DATE, DATE)
RETURNS TABLE(Month VARCHAR(10), Name1 VARCHAR(20), Name2 VARCHAR(20), x INTEGER)
STABLE
AS $$
SELECT
to_char((date + interval '330 minutes')::date, 'YYYY/MM') "Month",
Name1,
Name2,
count(*) "x"
FROM xyz
WHERE date > $1
AND date < $2
GROUP BY 1,2,3
ORDER BY 1,2,3
END
$$ LANGUAGE sql;
我运行了这个查询。它说:
Amazon无效操作:“ TABLE”或附近的语法错误
答案 0 :(得分:2)
在Redshift中,您只能定义标量函数,即返回单个值的标量函数。不幸的是,Redshift不支持基于集合的函数(那些返回表的函数)。
可能的原因是Redshift是一个分布式数据库,并且功能在计算节点上彼此独立地并行运行。基于集合的功能需要能够从数据库中读取数据,但是有些数据可能位于给定节点上,而另一部分则位于另一个节点上。此类功能不能在特定的计算节点上独立运行。您只需要在主节点上运行该功能。您不希望这样做,因为它与整个并行性概念背道而驰。
尝试在SQL查询中表达相同的逻辑。从您的代码看来,它可以像常规查询/子查询一样工作。