【问题标题】:MariaDB - update column with constant depending on another column valuesMariaDB - 根据另一列值更新具有常量的列
【发布时间】:2021-06-07 09:35:14
【问题描述】:

假设我有一个名为 mytable 的表,它看起来像这样:

我希望能够更新 p6 列中添加到 39 的所有记录,但仅适用于具有不同 p2 值的行。换句话说,结果表应该如下所示:

我将 p6 行着色为黄色以显示它不应该移动的位置,因为所有灰色的 p2 单元格都是相同的值。 绿色的 p6 行应该会增长,因为 p2 也会增长,所以我将 +39 添加到所有行。示例中的最后第 13 行再次为黄色,因为第 12 行上的 p2 = 第 13 行上的 p2

Gordon Linoff 的帮助下,我设法做到了这样的事情:

update mytable join
       (select mytable.*,
               (lag(p6) over(ORDER BY dt) +
                (case when lag(p2) over (order by dt) <> p2 then 39 ELSE 0 end)
               ) as new_p6
        from mytable
       ) tt
       on tt.id = mytable.id 
    set mytable.p6 = tt.new_p6
    where new_p6 <> mytable.p6;

但它没有按预期更新。你能帮我做吗?

使用数据更新:

id  dt  p2  p6
3   11.2.2021 15:45 536107.56   0
4   11.2.2021 15:50 536107.56   0
5   11.2.2021 15:55 536107.56   0
6   11.2.2021 16:00 536107.56   0
7   11.2.2021 16:05 536107.56   0
8   11.2.2021 16:10 609103.75   39
9   11.2.2021 16:15 609129.81   78
10  11.2.2021 16:20 609155.94   117
11  11.2.2021 16:25 609181.81   156
12  11.2.2021 16:30 609208.06   195
13  11.2.2021 16:35 609208.06   195

【问题讨论】:

  • 请将您的数据发布为文本而非图像
  • 已更新数据

标签: mysql sql sql-update mariadb


【解决方案1】:

如果你想枚举变化并乘以 39,那么你需要一些不同的逻辑:

update mytable join
       (select tt.*,
               sum(case when p2 <> prev_p2 then 1 else 0 end) over (order by dt) as cnt
        from (select tt.*,
                     lag(p2) over (order by dt) as prev_p2
              from mytable tt
             ) tt
       ) tt
       on tt.id = mytable.id 
    set mytable.p6 = cnt * 39
    where cnt > 0;

【讨论】:

  • 我加了 39,我不是乘以它
  • @BorislavStefanov 。 . .您将其乘以计数。是一样的。
  • 是的,同意。谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 2021-09-05
  • 1970-01-01
相关资源
最近更新 更多