我的MySQL版本低于v8.0,我希望通过下表将row_number()分配给(由AAB分区)。我尝试了以下代码,但它不起作用。如何使它起作用?
select
@part:=AAB as AAB,
AAG,AAD,
@num:=if(@part=AAB,@num:=@num+1,1) as rank
from IMPO_MEMB_AAAE a, (select @part:=null,@num:=0) b
order by AAB,AAG;
此问题突出显示了使用变量进行这种形式的计算的问题。您的问题是,您在@num
列表中评估SELECT
的时间比评估@part
的时间晚,并且在发生@part
时,为其分配了新值之前 @num
,这意味着@part=AAB
]始终是正确的。您可以通过在@num
列表中的@part
之前放置SELECT
来解决此问题,但是正如他们在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