繁体   English   中英

redshift - 如何插入表生成的时间序列

[英]redshift - how to insert into table generated time series

我正在尝试在 Redshift 中生成时间序列并插入表中,但没有运气。 到目前为止我已经尝试过:

insert into date(dateid,date)
SELECT
    to_char(datum, 'YYYYMMDD')::int AS dateid,
    datum::date AS date
FROM (
    select '1970-01-01'::date + generate_series(0, 20000) as datum
     ) tbl;

收到以下错误

SQL Error [500310] [0A000]: [Amazon](500310) Invalid operation: Specified types or functions (one per INFO message) not supported on Redshift tables.;

有什么想法或解决方法吗?

问题是generate_series()可以在领导节点上运行,但不能在计算节点上运行。

因此,可以运行如下语句:

SELECT '1970-01-01'::date + generate_series(0, 20000)

但是,不可能在FROM中使用该语句,因为这将涉及计算节点。

解决方案:在外部创建信息表并将结果加载到date表中,或者直接使用generate_series()生成所需的值,将结果保存并导入到date表中。

generate_series 函数在 Redshift 上不起作用

但是它确实会产生混淆! 这是因为在您尝试写入表之前,它看起来工作正常。

从技术上讲,这样做的原因是它只能在领导节点上工作。 并且领导节点本身没有直接访问表的权限。

如果你试试

SELECT CURRENT_DATE::TIMESTAMP - (i * interval '1 day') as date_datetime
FROM generate_series(1,31) i
ORDER BY 1;

这会产生一个很好的表输出,因为它已经在领导节点上运行。

但是,如果您运行

create table test as
SELECT CURRENT_DATE::TIMESTAMP - (i * interval '1 day') as date_datetime
FROM generate_series(1,31) i
ORDER BY 1;

这失败了

[2019-03-11 07:38:00] [0A000] 错误:Redshift 表不支持指定的类型或函数(每个 INFO 消息一个)。 [2019-03-11 07:38:00] [00000] 不支持函数“generate_series(integer,integer)”。

这是因为我们现在正在尝试创建一个表,所以 sql 必须在工作节点(而不是领导节点)上运行,所以它失败了。

作为一种解决方法,您可以使用如下查询生成整数序列:

WITH
digits AS (
    SELECT 0 AS v
    UNION SELECT 1
    UNION SELECT 2
    UNION SELECT 3
    UNION SELECT 4
    UNION SELECT 5
    UNION SELECT 6
    UNION SELECT 7
    UNION SELECT 8
    UNION SELECT 9
), 
seq AS (
    SELECT 10000*tens_of_thousands.v + 1000*thousands.v + 100*hundreds.v + 10*tens.v + units.v AS seq
    FROM digits as units
    CROSS JOIN digits AS tens
    CROSS JOIN digits AS hundreds
    CROSS JOIN digits AS thousands
    CROSS JOIN digits AS tens_of_thousands
    ORDER BY seq
)
SELECT * FROM seq;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM