在mysql中对结果进行排序(mysql等价于oracle中的'densite_rank()'或'row_number()'函数)

在mysql中对结果进行排序(mysql等价于oracle中的'densite_rank()'或'row_number()'函数),mysql,Mysql,以下是样本数据: dept_id salary 10 10000 10 20000 10 20000 10 30000 20 50000 20 60000 我想对部门id进行分组,然后按升序生成薪水的等级值。输出应该如下所示 部门id薪资等级 10 10000 1 10 20000 2 10 20000 2 10 30000 3 20 50000 1 20 60000 2 我正在使用以下代码:

以下是样本数据:

dept_id  salary
10       10000
10       20000
10       20000
10       30000
20       50000
20       60000
我想对部门id进行分组,然后按升序生成薪水的等级值。输出应该如下所示

部门id薪资等级

10  10000  1
10  20000  2
10  20000  2
10  30000  3
20  50000  1
20  60000  2
我正在使用以下代码:

set @pk1 ='';
set @rn1 =1;
set @sal ='';
set @val =1;

SELECT  dept_id,
        salary,
        denseRank
FROM
(
  SELECT  dept_id,
          salary,
          @rn1 := if(@pk1=dept_id, if(@sal=salary, @rn1, @rn1+@val),1) as denseRank,
          @val := if(@pk1=dept_id, if(@sal=salary, @val+1, 1),1) as value,
          @pk1 := dept_id,
          @sal := salary     
  FROM
  (
    SELECT  dept_id,
            salary
    FROM    emp
    ORDER BY dept_id,salary
) A
) B;

这对于一小部分数据来说效果很好,但在对数千行的整个数据运行这项操作时,速度会非常慢,而且会花费很长时间。是否有更好的方法或类似于oracle中密集排列或行数的预定义函数来更有效地完成此任务。

不知道它是否更快,但似乎键入的次数少了很多

SELECT x.*
     , IF(@prev = dept_id
                , IF(salary <> @psalary,@i:=@i+1,@i:=@i)
         ,@i:=1) rank
     , @psalary := salary
     , @prev := dept_id prev 
  FROM my_table x
     , (SELECT @i:=1,@prev:='',@psalary:='') vars 
 ORDER 
    BY dept_id,salary;

这里没有PK。这是有问题的。