【问题标题】:Updating field by previous record field value通过以前的记录字段值更新字段
【发布时间】:2018-05-28 16:37:17
【问题描述】:

我想从同一张表中以前的记录日期字段更新日期字段,例如:

ID_1   ID_2                  start_date                   end_date   
  1     33          2017-12-14 10:28:32.203000              null
  1     33          2017-12-13 10:28:29.153000              null    
  1     33          2017-12-12 10:28:25.246000              null    
  1     33          2017-12-11 10:28:21.917000              null    
  2      4          2017-12-10 10:28:18.005000              null    
  2      4          2017-12-09 10:28:14.145000              null    
  2      4          2017-12-08 13:24:26.964834              null

我想通过具有相同 ID_1 和 ID_2 的记录中的前一个 start_date 值更新 end_date 字段。例如:

   ID_1  ID_2                start_date                   end_date   
    2      4            2017-12-08 13:24:26.964834     2017-12-09 10:28:14.145000

谢谢

【问题讨论】:

  • 似乎是 LAG 或 LEAD 函数的好案例。我会让其他精通postgresql的人给你一个可靠的答案。
  • 我相信你会得到关于如何做到这一点的答案,但一旦你考虑你是否真的想要这样做。您基本上是在数据库中引入重复数据,这可能会在未来导致许多其他问题。与其添加重复数据,不如考虑如何使用现有数据在应用程序中执行您需要的任何操作(或创建一个视图,以对您有用的形式生成数据。

标签: sql database postgresql


【解决方案1】:

在 Postgres 中你可以这样做:

update t
    set end_date = tn.next_start_date
    from (select t.*,
                 lead(start_date) over (partition by id_1, id_2 order by start_date) as next_start_date
          from t
         ) tn
    where tn.id_1 = t.id_1 and tn.id_2 = t.id_2 and tn.start_date = t.start_date

【讨论】:

  • 非常感谢 Gordon Linoff,但您的查询中似乎存在语法错误,我不确定,但我猜在 "update t" 和 "SELECT" 之后缺少 "SET"在 " from (select t.*,"
  • 我收到此错误消息:[42P01] 错误:缺少表“t”的 FROM 子句条目,"set end_date = tn 之后的 "from" .next_start_date" 好像很麻烦
  • @MK-rou 。 . .这就是你的表名所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 2012-11-05
相关资源
最近更新 更多