Postgresql 如何将块中转换后的数据插入到原始表中?
我很确定这个问题以前会被问到,但我找不到答案,因为我不知道我应该寻找什么术语 我有一张桌子:Postgresql 如何将块中转换后的数据插入到原始表中?,postgresql,postgresql-9.5,Postgresql,Postgresql 9.5,我很确定这个问题以前会被问到,但我找不到答案,因为我不知道我应该寻找什么术语 我有一张桌子: create table tmp_test ( id serial primary key, value integer, value_2 numeric ); 最初,我们可以在表中找到以下条目: id value value_2 ______________________ 1 4 NULL 2 3 NULL 3
create table tmp_test (
id serial primary key,
value integer,
value_2 numeric
);
最初,我们可以在表中找到以下条目:
id value value_2
______________________
1 4 NULL
2 3 NULL
3 5 NULL
...
我已经提取了前两列,并进行了转换以获得第三列,现在我想更新tmp_table
,使其如下所示:
id value value_2
______________________
1 4 5.2
2 3 1.3
3 5 2.1
...
有没有一种方法可以一次完成这一切,而不是在行中循环并执行如下语句:
update tmp_table set value_2 = 5.2 where id = 1 and value = 4;
只要这样做:
update tmp_table set value_2 = value_1 / 2.0;
这将一次更新所有行(因为没有where
子句)。还请注意,在value_2
赋值的右侧,我们可以引用其他列(在这种情况下,列value_1
)。只需执行以下操作:
update tmp_table set value_2 = value_1 / 2.0;
这将一次更新所有行(因为没有
where
子句)。还要注意的是,在value\u 2
赋值的右侧,我们可以引用其他列(本例中为列value\u 1
。我假设您希望在value\u 2
列中插入应用程序中计算的一组数字。
使用两个数组,一个用于ID,另一个用于值:
select
unnest(array[1, 2, 3]) id,
unnest(array[5.2, 1.3, 2.1]) as value
id | value
----+-------
1 | 5.2
2 | 1.3
3 | 2.1
(3 rows)
使用主键标识值,并使用上述查询更新表:
update tmp_test t
set value_2 = n.val
from (
select
unnest(array[1, 2, 3]) id,
unnest(array[5.2, 1.3, 2.1]) as val
) n
where t.id = n.id;
select * from tmp_test;
id | value | value_2
----+-------+---------
1 | 4 | 5.2
2 | 3 | 1.3
3 | 5 | 2.1
(3 rows)
我假设您希望将应用程序中计算的一组数字插入列
value_2
。
使用两个数组,一个用于ID,另一个用于值:
select
unnest(array[1, 2, 3]) id,
unnest(array[5.2, 1.3, 2.1]) as value
id | value
----+-------
1 | 5.2
2 | 1.3
3 | 2.1
(3 rows)
使用主键标识值,并使用上述查询更新表:
update tmp_test t
set value_2 = n.val
from (
select
unnest(array[1, 2, 3]) id,
unnest(array[5.2, 1.3, 2.1]) as val
) n
where t.id = n.id;
select * from tmp_test;
id | value | value_2
----+-------+---------
1 | 4 | 5.2
2 | 3 | 1.3
3 | 5 | 2.1
(3 rows)
谢谢,但是这在更一般的情况下失败了,因为第二列不是那么简单地获得的。我将编辑原始帖子来反映这一点,我道歉!谢谢,但是这在更一般的情况下失败了,因为第二列不是那么简单地获得的。我将编辑原始帖子来反映这一点,我道歉!什么是转变?可以用SQL表示吗?如果是这样的话,您可以调整我的答案以使用该转换来代替
值_1/2.0
@Alex您如何从值
确定值_2
?它可能存储在其他地方,还是使用了您在此未提供的数据?请用详细信息编辑您的问题。@redneb我同意您的回答表明,根据转换情况,我们可以在数据库本身内完成此操作。但是,转换很难用SQL表示。我正在R
的其他地方做这件事@KamilG,它本质上是一个复杂的订单累计计数,按项目分组,考虑取消的订单。转变不是我这里的重点。我要做的是直接将填充的列value_2
写回表中。@如果它可以用SQL表示,您必须逐行执行。你也许可以分批处理它们,但这不会有很大的区别。如果转换完全依赖于数据库中某个位置(此表或其他表)的数据,那么它很可能可以用SQL表示。对,因此在最一般的情况下,我必须逐行进行转换。下面是一个我不相信它可以用SQL表示的例子:假设我们在一个表中有列y
和x_1
,x_2
,x_3
。。。使用随机林,我对xi
列和y
之间的关系进行建模。然后使用这个随机林,我预测了y
应该是什么。然后,一个典型的用例是将包含这些预测的新列yhat
写回数据库。也许用这些预测部署一个新表并将其链接到原始表很容易。转换是什么?可以用SQL表示吗?如果是这样的话,您可以调整我的答案以使用该转换来代替值_1/2.0
@Alex您如何从值
确定值_2
?它可能存储在其他地方,还是使用了您在此未提供的数据?请用详细信息编辑您的问题。@redneb我同意您的回答表明,根据转换情况,我们可以在数据库本身内完成此操作。但是,转换很难用SQL表示。我正在R
的其他地方做这件事@KamilG,它本质上是一个复杂的订单累计计数,按项目分组,考虑取消的订单。转变不是我这里的重点。我要做的是直接将填充的列value_2
写回表中。@如果它可以用SQL表示,您必须逐行执行。你也许可以分批处理它们,但这不会有很大的区别。如果转换完全依赖于数据库中某个位置(此表或其他表)的数据,那么它很可能可以用SQL表示。对,因此在最一般的情况下,我必须逐行进行转换。下面是一个我不相信它可以用SQL表示的例子:假设我们在一个表中有列y
和x_1
,x_2
,x_3
。。。使用随机林,我对xi
列和y
之间的关系进行建模。然后使用这个随机林,我预测了y
应该是什么。然后,一个典型的用例是将包含这些预测的新列yhat
写回数据库。也许使用这些预测部署一个新表并将其链接到原始表很容易。谢谢,如果有多个id
列,您是否将where子句扩展到:where t.id_1=n.id_1和t.id_2=n.id_2
?您不需要明确地将其作为id