Sql 如何在空列中执行UPDATE+数学函数?
我需要对一列执行一个简单的减法,然后将新值插入到一个新的table.column中 表的结构是这样的,逻辑不是一列,这是我想从数学上做的只是时间而不是日期,删除它也可以,但日期和时间在同一个单元格中粘在一起: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 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”。