根据每个员工的优点从高到低对他们进行排名
Posted
技术标签:
【中文标题】根据每个员工的优点从高到低对他们进行排名【英文标题】:Rank each employee based on their merit points from highest to lowest 【发布时间】:2018-02-21 10:26:32 【问题描述】:创建两个表emp_merits(meritid,empid,date,meritpoints),emp1(empid,empname) 每个员工每个月都会根据他们的表现获得功绩积分。因此,同一员工可以在表中有多个具有不同优点的条目。 列出特定员工在特定日期之间收到的所有优点(将在此处输入empid)
到目前为止我已经尝试过这个查询
select empid , sum (meritpoints) as totalmerits , (DENSE_RANK()OVER (PARTITION BY empid ORDER BY meritpoints desc)) AS rank from emp_merit
group by empid,meritpoints
order by empid ,totalmerits desc
【问题讨论】:
【参考方案1】:你可以试试这个:
SELECT @rownum := @rownum + 1 AS rank, a.*
FROM (
SELECT empid, sum(meritpoints) AS totalmerits
FROM emp_merits
GROUP BY empid
ORDER BY totalmerits) a, (SELECT @rownum := 0) r ;
您可能需要在 WHERE 子句中包含您的具体日期。
【讨论】:
它的显示错误,请您明确指出 错误是什么?我已经以这种方式建模了create table emp_merits (meritid int, empid int, d date, meritpoints int);
insert into emp_merits values(1,1,STR_TO_DATE('2018-02-12','%Y-%m-%d'),10); insert into emp_merits values(2,1,STR_TO_DATE('2018-02-12','%Y-%m-%d'),20); insert into emp_merits values(3,2,STR_TO_DATE('2018-02-12','%Y-%m-%d'),25); insert into emp_merits values(4,3,STR_TO_DATE('2018-02-12','%Y-%m-%d'),15); insert into emp_merits values(5,3,STR_TO_DATE('2018-02-12','%Y-%m-%d'),35);
并且它可以工作。
你可以先试试内插。主要的是你应该只在你的 GROUP BY 子句中使用 empid。不是优点。
表的表数据如下
empid mgrid empname 1 20 Ramya 2 30 Harish 3 20 Deepak 4 40 NULL 5 NULL Supriya 6 60 NULL 7 NULL Ramesh【参考方案2】:
您可以使用变量实现dense_rank()
:
select empid, totalmerits,
(@rn := if(@m = totalmerits, @rn,
if(@m := totalmerits, @rn + 1, @rn + 1)
)
) as rank
from (select empid, sum(meritpoints) as totalmerits
from emp_merit
group by empid
order by totalmerits desc
) e cross join
(select @m := -1, @rn := 0) params;
【讨论】:
以上是关于根据每个员工的优点从高到低对他们进行排名的主要内容,如果未能解决你的问题,请参考以下文章