我尝试使用以下查询插入接下来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;
答案 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()
时,该命令也会失败。