这个问题突出了使用变量进行这种计算的问题。你的问题是你正在评估
@num
稍后在
SELECT
列表比你评估的要多
@part
事实上
@零件
为其分配新值
之前
@num
是计算出来的,这意味着
@part=AAB
总是正确的。你可以通过放置
@num
之前
@零件
在
选择
列表,但正如他们在
manual
:
涉及用户变量的表达式的求值顺序未定义。例如,不能保证SELECT@a,@a:=@a+1首先计算@a,然后执行赋值。
碰巧的是,它通常确实是这样工作的,所以在您升级之前,您可能可以使用此查询:
select
@num:=if(@part=AAB,@num:=@num+1,1) as rank,
@part:=AAB as AAB,
AAG,AAD
from IMPO_MEMB_AAAE a, (select @part:=null,@num:=0) b
order by AAB,AAG;
输出:
rank AAB AAG AAD
1 10000751 2020-01-02 16:06:00 41
1 10033980 2020-01-02 22:55:00 40
1 10041030 2020-01-02 22:50:00 41
2 10041030 2020-01-02 23:53:00 40
3 10041030 2020-01-02 23:53:00 40
4 10041030 2020-01-02 23:53:00 40
1 10049083 2020-01-02 12:58:00 41
2 10049083 2020-01-02 12:58:00 40
3 10049083 2020-01-02 12:58:00 40
4 10049083 2020-01-02 12:58:00 41
5 10049083 2020-01-02 12:58:00 40
6 10049083 2020-01-02 12:58:00 40
1 10061286 2020-01-02 05:44:00 41
1 10081536 2020-01-02 12:11:00 41
1 10092699 2020-01-02 19:12:00 41
1 10116976 2020-01-02 22:03:00 41
Demo on dbfiddle