Sql 每月提取所有奖金最高的员工。最大(总和)分组依据

Sql 每月提取所有奖金最高的员工。最大(总和)分组依据,sql,sql-server,Sql,Sql Server,如何提取每月最高奖金的所有员工 我有一张桌子: id_prem id_emp months premium 1 1 2016-01-01 00:00:00.000 3000 3 1 2016-01-01 00:00:00.000 2000 5 1 2016-03-01 00:00:00.000 3000 6 1 2016-01-16 00:00:00.000 300

如何提取每月最高奖金的所有员工

我有一张桌子:

id_prem id_emp  months                  premium
1       1       2016-01-01 00:00:00.000 3000
3       1       2016-01-01 00:00:00.000 2000
5       1       2016-03-01 00:00:00.000 3000
6       1       2016-01-16 00:00:00.000 3000
8       1       2016-01-11 00:00:00.000 2000
7       2       2016-02-14 00:00:00.000 5000
2       2       2016-02-01 00:00:00.000 5000
4       3       2016-02-01 00:00:00.000 1000
9       3       2016-02-09 00:00:00.000 1000
有必要将每个员工每月的奖金相加,以获得最高奖金 因此,只能获得每月奖金最高的员工

我的问题是:

SELECT id_emp, mon, MAX(sum_prem) as max_premium
FROM(SELECT id_emp, month(months) as mon, SUM(premium) as sum_prem FROM Employee.Emp_prem 
GROUP BY id_emp, month(months))as t 
GROUP BY id_emp, mon
结果:

id_emp mon  max_premium
1      1    10000
2      2    10000
3      2    2000
1      3    3000
这不是正确的结果


因此,我需要只显示每个月的最高奖金。

我认为您需要使用窗口功能进行聚合。大概是这样的:

select e.*
from (select id_emp, year(months) as yyyy, month(months) as mm, sum(premium) as premium,
             row_number() over (partition by year(months), month(months) order by sum(premium) desc) as seqnum
      from Employee.Emp_prem 
      group by id_emp, year(months), month(months)
     ) e
where seqnum = 1;

大多数DBMS支持
RANK
/
ROW\u NUMBER
用您正在使用的数据库标记您的问题。@ББСаааааааааааааа。这是一个简单的方式来表达你对他的时间和才华的赞赏。