Создайте две таблицы emp_merits (meritid, empid, date, meritpoints), emp1 (empid, empname). Каждый сотрудник будет получать очки за заслуги каждый месяц в зависимости от их производительности. Таким образом, один и тот же сотрудник может иметь несколько записей в таблице с разными точками доступа. Перечислите все достоинства, полученные конкретным сотрудником (здесь будет введено эмпирическое письмо) между конкретными датами. Ранжируйте каждого сотрудника на основе их точек достоинства от наивысшего до самого низкого
до сих пор я пробовал этот запрос
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
Вы можете реализовать 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;
Вы можете попробовать следующее:
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);
и это работает.