无法使用redshift中的generate_series()插入数据

时间:2017-05-15 10:59:57

标签: sql amazon-redshift

我尝试使用以下查询插入接下来10天的所有日期。

INSERT INTO sda.all_dates (checkin)
SELECT CURRENT_DATE +  generate_series(0, 10) AS checkin;

但无法做到,收到错误

INFO:  Function "generate_series(integer,integer)" not supported.
ERROR:  Specified types or functions (one per INFO message) not supported on Redshift tables.

当我只执行SELECT部分​​时,它会给出正确的结果

SELECT CURRENT_DATE +  generate_series(0, 10) AS checkin;

4 个答案:

答案 0 :(得分:0)

Amazon Redshift不支持您正在寻找的内容。

参考: Amazon Redshift Documentation for unsupported functions

generate_series()是Amazon Redshift不支持的众多postgres功能之一

答案 1 :(得分:0)

当您仅执行SELECT时,查询将在leader节点上执行,因为不需要表扫描,这就是您获得正确结果的原因。

当你涉及红移表(如INSERT INTO)时,在计算节点上执行带有generate_series()的查询,这在红移中不是受支持的函数。

如果我做了一个错误的假设,请发表评论,我将重新调整我的答案。

答案 2 :(得分:0)

如上所述,Redshift不支持生成器。

您有两个选择:

1)像这样的小黑客:

with
series as (
    select 1 as n
    union select 2
    union select 3
)
select (current_date+interval '1 day'*n)::date
from series

2)创建一个维度表来存储日历的每个日期,这样你就会有这样的事情:

select date 
from dim.calendar 
where date between current_date and current_date+interval '10 day'

您可以通过在Postgres中运行generate_series()创建此类表,将结果复制到CSV并将该CSV加载到Redshift,它必须完成一次。除日期外,根据您的目标,您可以从日期(星期,月,季等的第一个日期)获得不同的衍生物。

答案 3 :(得分:0)

为了解决这个限制,我将包含 generate_series() 的查询输出导出到我的本地主机,将其上传到 redshift 并通过复制命令插入数据。我尝试使用 unload(),但是当您使用 generate_series() 时,该命令也会失败。