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
晚,并且碰巧 @part
在 before @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
我的 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
晚,并且碰巧 @part
在 before @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