代码之家  ›  专栏  ›  技术社区  ›  davidzxc574

Mysql v8.0以下版本使用@num分配row_number(分区)

  •  0
  • davidzxc574  · 技术社区  · 5 年前

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

    0 回复  |  直到 5 年前
        1
  •  0
  •   Nick SamSmith1986    5 年前

    这个问题突出了使用变量进行这种计算的问题。你的问题是你正在评估 @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