如何使用sql添加列,使每个记录中的单位都是其他列计算的结果?

如何使用sql添加列,使每个记录中的单位都是其他列计算的结果?,sql,insert,netezza,Sql,Insert,Netezza,我正在使用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

我正在使用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而不运行我的按顺序创建新表

非常感谢你的帮助。 仍然需要帮助

SQL Server不能“以本机方式”执行此操作,但您可以通过一个insert和update触发器来完成此操作,该触发器响应对两列的更改并更新第三列


编辑--我站着更正:SQLServer可以以本机方式执行此操作。请参见Amireza Keshavarz的答案。

您在这里查找的内容通常被称为“计算列”。Netezza没有实现此功能,也没有实现触发器(另一种方法,您可以通过它获得相同的结果)。由于Netezza专注于数据仓库,因此您所讨论的各种计算通常在ETL过程中通过ETL工具完成

Alter table SEQ_6_3_FNN_CID218_ORDERED
Add att2 as (att1-tmp)
好消息是,您完全可以通过SQL和LAG函数来实现这一点,而LAG函数正是为了实现这一点而设计的。然后,如果您愿意,可以在视图中对其进行编码

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;

@总而言之,可以减去负数什么味道?SQL Server?@OverMind只需插入计算出的内容,假设TMP是TIMESTAMP类型,并且是键,ATT1和ATT2是数字。@roryap是的,SQL Server。@roryap我是新来的,不太了解SQL和SQL Server的区别。:你能举个小例子吗?我是sql新手。谢谢!这不是我想要的。虽然我是新来的,但没那么笨。他的答案远非正确。我想说的是,如果我有125的声誉,我很抱歉,但这不仅仅是att1 tmp。这是att1(当前)-att1(以前)Thx非常,这确实是有益的!这里的“滞后”是什么意思?滞后是指引用前一行,它比当前行“滞后”偏移量(在本例中为1)。为了使“前一行”有意义,您必须定义一个顺序,这里我们指定COL1定义该顺序。感谢您的解释。滞后的第三个参数“NULL”是什么意思?我猜第二个参数“1”的意思是“滞后1”?:)第二个参数是偏移量,即要倒计时的行数。对于您的示例,我们希望查看当前行后面的第1行,因此偏移量为1。第三个参数是标量值,当偏移量引用不存在的行时,应返回该标量值。在您的示例中,第一行之前没有一行用于引用和计算,因此我们将其设置为返回NULL。这非常有用!谢谢!!