【问题标题】:update value in row based on value in another row根据另一行中的值更新行中的值
【发布时间】:2019-09-30 21:27:26
【问题描述】:

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

t_stamp | col1 | col2 | col3

我想根据表中前一行的 col1 和 col2 中的值更新 say col3 中的值。上一行是指具有下一个最低时间戳值的行。我也想对表中的每一行都这样做。

例如:

col3 = col1.prev + col2

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

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

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

但这不会更新表中的值。我可以以某种方式将其应用于原始表吗?或者有没有办法以相同的方式格式化更新查询?

【问题讨论】:

  • 请提供样本数据和期望的结果来说明您的计算。

标签: sql postgresql sql-update postgresql-9.6


【解决方案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;

【讨论】:

  • 谢谢。这就像一个魅力。一个澄清的问题。您在回答中说过要使用“使用”子句,但您的解决方案中没有使用子句。错字?
  • 是的,很抱歉,我修正了文本。
【解决方案2】:

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

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

【讨论】:

  • 不。该等式仅作为示例显示,以说明 col3 的结果将取决于前一行中另一列的值。这不是我想要执行的计算。
【解决方案3】:

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

How to get previous row data in sql server

【讨论】:

  • 我已经使用滞后来计算值。如果您更仔细地阅读我的问题,您会看到这一点。问题不是如何计算值,而是在计算完值后如何更新表格。
【解决方案4】:

使用子查询..会解决..这是一个示例

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

【讨论】:

  • 我已经使用滞后来计算值。如果您更仔细地阅读我的问题,您会看到这一点。问题不是如何计算值,而是计算值后如何更新表格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多