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