我的表格EMPLOYEE
包含3个字段:
EMPLOYEE(ROLE SMALLINT, RATING INTEGER, NAME VARCHAR)
我需要从这张表中只获得3排。它是每种类型的一行,其类型的评级最高。该字段的作用 - 是从三个值列表中定义特定角色的判别式:DEVELOPER(1),TESTER(2),MANAGER(3)。因此,ROLE字段的值可以是1或2或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
)
但是,如果您有两名具有相同角色和评级的员工,这将无效。在这种情况下,您需要在子查询中选择名称。