相当棘手的SQL查询

时间:2013-05-31 07:31:50

标签: sql postgresql

我的表格EMPLOYEE包含3个字段:

EMPLOYEE(ROLE SMALLINT, RATING INTEGER, NAME VARCHAR)

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

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:2)

Postgres特定的简短查询:

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

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

答案 2 :(得分:0)

如果我理解你的问题,那么对于每个角色,你想要具有最高评级的名称:

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

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

相关问题