一年中的一年和一周的分区表

时间:2016-01-28 07:10:24

标签: vertica

我正在尝试ALTER一张桌子,但它给出了以下错误:

alter table TABLE_NAME partition by EXTRACT(YEAR FROM to_timestamp(CC)); 

ROLLBACK 2552:  Cannot use meta function or non-deterministic function in PARTITION BY expression 

alter table TABLE_NAME partition by date_part('YEAR',to_timestamp(CC)); 

ROLLBACK 2552:  Cannot use meta function or non-deterministic function in PARTITION BY expression

CC栏中的数据类似于

1441650600 

EPOCH时间

有谁知道原因?

2 个答案:

答案 0 :(得分:0)

如您所知,Vertica根据其行为将函数分类为volatile,stable和immutable。更多详情here

现在,您可以在管理员指南here PARTITION BY子句中查看表达式,只能在TO_TIMESTAMP()时使用不可变函数 - 因为您可以检查here - 只有"稳定"。

答案 1 :(得分:0)

我个人认为通过以下方式可以更轻松地进行这些类型的更改: 1.创建一个新的临时表(包含要进行的更改),它反映了我想要更改的表 2.然后我将所有数据复制到新表中 3.删除原始表 4.将新表重命名为现有名称。

这是我工作的版本控件的一个方面,所有内容都存储在Delta脚本中,因此我的代码的所有更改都已完整记录。

至于使用alter语句创建投影我真的无法评论但是我确实有一个我觉得适合你的脚本,因为我使用的是类似的数据格式。该列名为DateKey,格式为YYYYMMDD00:

2014020100

我想按年份和季度进行分区,所以我写了以下内容

CREATE TABLE Schema1.fct_Table1 (
DateKey INT NOT NULL,
col1 INT NOT NULL,
col2 INT NOT NULL,
col3 INT NOT NULL,
col4 INT NOT NULL,
col5 INT NOT NULL
)
ORDER BY DateKey, col1, col2, col3
PARTITION BY left(cast(DateKey as char(10)),4) 
        || case 
        when substring(cast(DateKey as char(10)),5,2) in ('01','02','03') then '01' 
        when substring(cast(DateKey as char(10)),5,2) in ('04','05','06') then '02' 
        when substring(cast(DateKey as char(10)),5,2) in ('07','08','09') then '03' 
        when substring(cast(DateKey as char(10)),5,2) in ('10','11','12') then '04'  end;

所以我的脚本按当年的年份和季度划分, 即 第1 - 3个月是Qtr 1 月4 - 6是qtr 2等。

我猜你可以这样写:

PARTITION BY case 
        when substring(cast(DateKey as char(10)),5,2) = '01' then '01'
        when substring(cast(DateKey as char(10)),5,2) = '02' then '02'