v8.0以下的Mysql用@num分配row_number(分区依据)

问题描述 投票:0回答:1

我的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;

Table to rank

mysql partition row-number
1个回答
0
投票

此问题突出显示了使用变量进行这种形式的计算的问题。您的问题是,您在@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

Demo on dbfiddle

© www.soinside.com 2019 - 2024. All rights reserved.