【问题标题】:Return a table from a user defined function in Redshift从 Redshift 中的用户定义函数返回表
【发布时间】:2019-09-11 15:46:31
【问题描述】:

我有一个复杂的查询,它为某些两个日期(开始日期和结束日期)提供多行。

现在我想创建一个函数,以便我可以为不同的日期组合返回多行。

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”处或附近的语法错误

【问题讨论】:

  • 创建函数 f_sql_greater (float, float) 当 $1 > $2 然后 $1 else $2 end $$ language sql 时返回 float stable 作为 $$ 选择案例;这是AWS文档中给出的代码,但没有说明如何返回表?

标签: amazon-web-services amazon-redshift


【解决方案1】:

在 Redshift 中,您只能定义标量函数,即返回单个值的函数。不幸的是,Redshift 不支持基于集合的函数(返回表的函数)。

可能的原因是 Redshift 是一个分布式数据库,并且函数在计算节点上并行运行,彼此独立。基于集合的函数需要能够从数据库中读取数据,但有可能一些数据位于给定节点上,而另一部分位于另一个节点上。这样的功能不能独立运行在特定的计算节点上。您必须仅在主节点上运行此类功能。您不想这样做,因为它违反了并行性的整个概念。

尝试在 SQL 查询中表达相同的逻辑。从您的代码来看,它似乎可以用作常规查询/子查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2020-11-15
    相关资源
    最近更新 更多