MariaDB - 根据另一列值更新具有常量的列
MariaDB - update column with constant depending on another column values
假设我有 table 命名为 mytable,它看起来像这样:
我希望能够更新 p6 列中的所有记录,添加到 39 但仅针对具有不同 p2[=40= 的行] 值。换句话说,结果 table 应该是这样的:
我将 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
如果要枚举变化并乘以 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;
假设我有 table 命名为 mytable,它看起来像这样:
我希望能够更新 p6 列中的所有记录,添加到 39 但仅针对具有不同 p2[=40= 的行] 值。换句话说,结果 table 应该是这样的:
我将 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
如果要枚举变化并乘以 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;