1

我有EMPLOYEE3个字段的表:

EMPLOYEE(ROLE SMALLINT, RATING INTEGER, NAME VARCHAR)

我只需要从这个表中获取 3 行。它是每种类型的一排,在其类型中具有最高评级。字段的角色 - 是从三个值列表中定义特定角色的判别式:DEVELOPER(1)、TESTER(2)、MANAGER (3)。所以 ROLE 字段的值可以是 1 或 2 或 3。

4

3 回答 3

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().

于 2013-05-31T07:39:42.027 回答
2

Postgres 特定的简短查询:

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

如果 2 名员工具有相同的角色和等级 - 将随机挑选其中一名。

于 2013-05-31T12:22:23.477 回答
0

如果我正确理解您的问题,您希望为每个角色提供评分最高的名称:

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

但是,如果您有两个具有相同角色和等级的员工,这将无法正常工作。在这种情况下,您需要在子查询中选择名称。

于 2013-05-31T08:22:44.567 回答