Sql 如何在空列中执行UPDATE+数学函数?

Sql 如何在空列中执行UPDATE+数学函数?,sql,postgresql,math,amazon-redshift,Sql,Postgresql,Math,Amazon Redshift,我需要对一列执行一个简单的减法,然后将新值插入到一个新的table.column中 表的结构是这样的,逻辑不是一列,这是我想从数学上做的只是时间而不是日期,删除它也可以,但日期和时间在同一个单元格中粘在一起: Table A A Time (Logic) 1 aaa YYYY-MM-DD HH:MM:SS (row2 - row1) 2 aaa YYYY-MM-DD HH:MM:SS

我需要对一列执行一个简单的减法,然后将新值插入到一个新的table.column中

表的结构是这样的,逻辑不是一列,这是我想从数学上做的只是时间而不是日期,删除它也可以,但日期和时间在同一个单元格中粘在一起:

Table A         
    A       Time                      (Logic)
1   aaa   YYYY-MM-DD HH:MM:SS         (row2 - row1)
2   aaa   YYYY-MM-DD HH:MM:SS         (row3-row2)
3   aaa   YYYY-MM-DD HH:MM:SS         (row4-row3)


Table B         
        A         new_time  
    1   aaa       insert logic row 1    
    2   aaa       insert logic row 2    
    3   aaa       insert logic row 3    
问题是如何从下一行减去tableA.time的每一行,并将该值更新为tableB.new_time

---编辑--

@克林

这是我模仿你的脚本:

update tableB
set new_time = tableA.time
from (
    select tableA.A- lead(tableA.A) over (order by tableB.B) 
    from tableA
    ) tableA.A
where tableB.a = tableA.A
错误消息:

SQL Error [500310] [42P10]: [Amazon](500310) Invalid operation: subquery in FROM may not refer to other relations of same query level;

可以在更新中将子查询用作数据源。例如:

create table table_a (id int primary key, t timestamp);
insert into table_a values
(1, '2016-09-01'), (2, '2016-09-02'), (3, '2016-09-04');

create table table_b (id int primary key, i interval);
insert into table_b values
(1, null), (2, null), (3, null);

update table_b b
set i = a.i
from (
    select id, t - lead(t) over (order by id) i
    from table_a
    ) a
where b.id = a.id;

select * from table_b;

 id |    i    
----+---------
  1 | -1 days
  2 | -2 days
  3 | 
(3 rows)
单字母别名很方便,但有时不太清楚。具有更多信息别名的同一查询:

update table_b as alias_b
set i = subquery.i
from (
    select id, t - lead(t) over (order by id) i
    from table_a
    ) as subquery
where alias_b.id = subquery.id;

可以在更新中将子查询用作数据源。例如:

create table table_a (id int primary key, t timestamp);
insert into table_a values
(1, '2016-09-01'), (2, '2016-09-02'), (3, '2016-09-04');

create table table_b (id int primary key, i interval);
insert into table_b values
(1, null), (2, null), (3, null);

update table_b b
set i = a.i
from (
    select id, t - lead(t) over (order by id) i
    from table_a
    ) a
where b.id = a.id;

select * from table_b;

 id |    i    
----+---------
  1 | -1 days
  2 | -2 days
  3 | 
(3 rows)
单字母别名很方便,但有时不太清楚。具有更多信息别名的同一查询:

update table_b as alias_b
set i = subquery.i
from (
    select id, t - lead(t) over (order by id) i
    from table_a
    ) as subquery
where alias_b.id = subquery.id;

没有第0行,您想从第1行减去什么?更重要的是,时间戳之间的差异是一个间隔。您打算如何将该间隔存储在以前保存时间戳的同一列中?@a_horse_,带_no_name SELECT语句只是我在胡闹,因此我说它是在纸上的,我来自MySql背景,所以试图将其映射出来。@redneb我的道歉应该从第1行开始,我将更新它。我不需要将其存储在同一列中,我需要用与表A的时间差更新表B.new_timehelps@a_horse_with_no_name暂时不要理会我的SQL语句,我只是在尝试一些逻辑。我需要在tableB.new_time上运行一个更新,时间与tableA.time之间存在时间差。时间没有第0行,您想从第1行减去多少?更重要的是,时间戳之间的差异是一个间隔。您打算如何将该间隔存储在以前保存时间戳的同一列中?@a_horse_,带_no_name SELECT语句只是我在胡闹,因此我说它是在纸上的,我来自MySql背景,所以试图将其映射出来。@redneb我的道歉应该从第1行开始,我将更新它。我不需要将其存储在同一列中,我需要用与表A的时间差更新表B.new_timehelps@a_horse_with_no_name暂时不要理会我的SQL语句,我只是在尝试一些逻辑。我需要在table b.new_time上运行一个更新,时间与table a.time的时间不同。我一直在尝试使用你的UPDATE语句,但我对所有表的额外名称感到困惑。我用模仿你的脚本和收到的错误消息进行了编辑。谢谢你的清理,如果你能帮忙,我还有一个问题。您的查询工作正常,但由于日期和时间包含在同一单元格中,有没有办法先将日期切掉,然后只对时间进行计算?您可以将时间戳转换为时间,例如,选择“2016-10-01 12:12:12”::时间产生“12:12:12”替代符号选择时间“2016-10-01 12:12:12”。我一直在尝试使用您的更新语句,但我对表的所有额外名称感到困惑。我用模仿你的脚本和收到的错误消息进行了编辑。谢谢你的清理,如果你能帮忙,我还有一个问题。您的查询工作正常,但由于日期和时间包含在同一个单元格中,有没有办法先将日期切掉,然后只对时间进行计算?您可以将时间戳转换为时间,例如选择“2016-10-01 12:12:12”::时间产生“12:12:12”替代符号选择时间“2016-10-01 12:12:12”。