2013-05-31 46 views
1

我有表EMPLOYEE有3个字段:相当棘手的SQL查询

EMPLOYEE(ROLE SMALLINT, RATING INTEGER, NAME VARCHAR) 

我需要从这个表中只有3排得到。它是每种类型中具有最高评级的一行。该领域的作用 - 是从三个值列表中定义具体角色的判别式:开发者(1),测试者(2),经理(3)。所以角色字段的值可以是1或2或3

回答

2

Postgres的特定短查询:

SELECT DISTINCT ON (role) role, name, rating 
FROM employee 
ORDER BY role, rating DESC 

如果2员工具有相同的作用,并评价 - 其中一人将被随机选出。

+1

这应该是被接受的答案。 –

3

这是一个基本的聚集查询(我假设你是新的SQL):

select role, max(rating) 
from employee 
group by role 

在回应评论(我可以看到这个问题是如何模糊的)。在Postgres而言,要做到这一点,正确的方法是使用一个窗口函数:

select role, rating, name 
from (select e.*, 
      row_number() over (partition by role order by rating desc) as seqnum 
     from employee e 
    ) e 
where seqnum = 1 

这个版本只返回一行,即使有重复。如果您想要在具有相同最大值的倍数时使用所有行,请使用rank()而不是row_number()

+0

NAME已被提交?声明'GROUP BY角色'不能在SELECT中与NAME正常工作 – Alex

+0

我认为row_number()需要按角色 – dotjoe

+0

@dotjoe进行分区。 。 。谢谢。我修正了这一点。 –

0

如果我正确理解你的问题,你想,每个角色,最高等级名称:

select role, rating, name 
from employee as e1 
where rating = (
    select max(rating) from employee 
    where role = e1.role 
) 

的权利,如果你有两个员工具有相同的作用,并评价这是行不通的,虽然。在这种情况下,您需要在子查询中选择名称。