我有一个表格,其结构类似于下面。
+ ---- + --------------- + ------- + | id |小组|价值| + ---- + --------------- + ------- + | 1 | g1 | null | | 2 | g1 | null | | 3 | g2 | null | | 4 | g2 | null | | 5 | g2 | null | | 6 | g3 | null | | 7 | g3 | null | | 8 | g4 | null | | 9 | g4 | null | + ---- + --------------- + ------- +
我需要更新值列,以便表格看起来像
+ ---- + --------------- + ------- + | id |小组|价值| + ---- + --------------- + ------- + | 1 | g1 | 1 | | 2 | g1 | 2 | | 3 | g2 | 1 | | 4 | g2 | 2 | | 5 | g2 | 3 | | 6 | g3 | 1 | | 7 | g3 | 2 | | 8 | g4 | 1 | | 9 | g4 | 2 | + ---- + --------------- + ------- +
基本上我是基于value
列增加group
列。
你可以尝试下面 - 使用自我加入
update tablename t
join
(select b.id,b.groupname,count(b.id) as val from t1 a
join t1 b on a.groupname=b.groupname
and a.id<=b.id
group by b.id,b.groupname
)d on t.id=d.id
set value=val
要么
如果你的mysql版本是8.0+,你可以使用row_number()
函数
update tablename t
join
(
select *, row_number() over(partition by groupname order by id) as rn from t1
)d on t.id=d.id
set value=rn
请试试这个我希望这对你有用
Update A
set value = _val
from @tblName As A
INNER JOIN (
SELECT id,Row_NUMBER() over(partition by [group] order by id) as _val from @tblName
)As B ON A.id = B.id
在旧版本的MySQL中,变量是最简单的方法:
set @rn := 0;
set @grp := '';
update t
set value = (@rn := if(@grp = t.group, @rn + 1,
if(@grp := t.group, 1, 1)
)
)
order by group, id;
在MySQL 8.0中,使用fa06的第二个查询。