我正在使用Netezza来操纵一些数据。我试图向表中添加一个列,该表的值是计算其他列的结果。
首先,我运行这个sql来创建一个表来重新排列其他表的顺序:
CREATE TABLE SEQ_6_3_FNN_CID218_ORDERED AS
SELECT A.* FROM SEQ_6_3_FNN_CID218 A
ORDER BY TIMESTAMP然后,我需要的是这样的,假设列TMP和ATT1已经存在,我需要插入ATT2:
TMP ATT1 ATT2
1 1 NULL
2 4 4-1=3
3 5 5-4=1
4 8 8-5=3
5 9 9-8=1
6 12 12-9=3实现这一目标的sql是什么?或者,是否有一种方法可以直接在SEQ_6_3_FNN_CID218上运行sql而不按顺序运行我的create表?
非常感谢你的帮助。仍然需要帮助!
发布于 2014-07-16 14:11:43
你在这里寻找的经常被称为“计算列”。Netezza没有实现此特性,也没有实现触发器(另一种可能实现相同结果的方法)。由于Netezza专注于数据仓库,所以您所讨论的计算类型通常是在ETL过程中通过ETL工具完成的。
好消息是,您可以完全通过SQL来完成这一任务,而滞后函数正是为此而设计的。然后,如果您愿意,您可以在视图中对其进行编码。
TESTDB.ADMIN(ADMIN)=> insert into base_table select * from base_ext;
INSERT 0 6
TESTDB.ADMIN(ADMIN)=> select * from base_table order by col1;
COL1 | COL2
------+------
1 | 1
2 | 4
3 | 5
4 | 8
5 | 9
6 | 12
(6 rows)
TESTDB.ADMIN(ADMIN)=> select col1, col2, col2 - lag(col2,1,NULL) over (
TESTDB.ADMIN(ADMIN)(> order by col1 asc) col3 from base_table;
COL1 | COL2 | COL3
------+------+------
1 | 1 |
2 | 4 | 3
3 | 5 | 1
4 | 8 | 3
5 | 9 | 1
6 | 12 | 3
(6 rows)为了清晰起见,SQL同样是:
select col1, col2, col2 - lag(col2,1,NULL) over ( order by col1 asc) col3 from base_table;发布于 2014-07-15 15:33:34
Server“本机”无法做到这一点,但您可以使用一个insert和update触发器来响应对这两列的更改并更新第三列。
编辑--我被纠正了: Server可以在本地完成这一任务。请看阿姆·因尼扎·凯萨瓦兹的答案。
发布于 2014-07-15 15:42:00
Alter table SEQ_6_3_FNN_CID218_ORDERED
Add att2 as (att1-tmp)https://stackoverflow.com/questions/24762297
复制相似问题