我正在尝试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时间
有谁知道原因?
答案 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'
等