根据另一行中的值更新行中的值

时间:2019-05-13 22:10:18

标签: sql postgresql sql-update postgresql-9.6

我有一张带有时间戳的数据表。

t_stamp | col1 | col2 | col3

我想基于表中前一行的col1和col2中的值来更新col3中的值。上一行是指时间戳记值第二低的行。我也想对表中的每一行进行此操作。

例如:

col3 = col1.prev + col2

注意:此处的操作仅作为示例提供。给定col1,col2和/或以前的任何一个函数,我想为col3计算一个值。

我能够使用窗口函数创建SELECT查询,从而为我提供所需的col3值

SELECT lag(col1) OVER (ORDER BY t_stamp ASC) + col2 AS col3
FROM table1

,但这不会更新表中的值。我可以以某种方式将此方法应用于原始表格吗?还是可以用相同的方式格式化更新查询?

4 个答案:

答案 0 :(得分:1)

您只需要将FROM子句与已经拥有的查询一起使用:

UPDATE test set col3 = prev_col1 + prev_col2
FROM (
  SELECT t_stamp,
      lag(col1) OVER (ORDER BY t_stamp ASC) prev_col1,
      lag(col2) OVER (ORDER BY t_stamp ASC) prev_col2
  FROM test) prev 
  WHERE prev.t_stamp = test.t_stamp;

答案 1 :(得分:0)

我想你想要一个累加的总和:

SELECT (sum(col2 + co1) OVER (ORDER BY t_stamp ASC) - col1) AS col3
FROM table1

答案 2 :(得分:0)

创建前3列,然后使用Lag创建最后一个列。

How to get previous row data in sql server

答案 3 :(得分:0)

使用Sub查询..将解决..这是一个示例

select col2+p_col1 from
(
SELECT col1, col2, lag(col1) OVER (ORDER BY t_stamp ASC) as p_col1
FROM table1
) t