下面是示例数据:
dept_id salary
10 10000
10 20000
10 20000
10 30000
20 50000
20 60000
我想对部门ID进行分组,然后按升序生成薪水等级值.输出应为
dept_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中的density_rank()或row_number())来更有效地完成此任务.