Mysql below v8.0 分配 row_number (partition by) with @num

Mysql below v8.0 assigning row_number (partition by) with @num

我的 MySQL 版本低于 v8.0,我想用下面的 table 分配 row_number() (AAB 分区)。我尝试了以下代码,但没有成功 work.How 我可以让它工作吗?

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;

这个问题突出了使用变量进行这种计算形式的问题。你的问题是你在 SELECT 列表中评估 @num 比你评估 @part 晚,并且碰巧 @partbefore @num 被计算出来,这意味着 @part=AAB 总是正确的。您可以通过在 SELECT 列表中的 @part 之前放置 @num 来解决此问题,但正如他们在 manual 中所说:

The order of evaluation for expressions involving user variables is undefined. For example, there is no guarantee that SELECT @a, @a:=@a+1 evaluates @a first and then performs the assignment.

碰巧它通常似乎是这样工作的,所以在您升级之前,您可能可以使用这个查询:

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