我有表EMPLOYEE
有3个字段:相当棘手的SQL查询
EMPLOYEE(ROLE SMALLINT, RATING INTEGER, NAME VARCHAR)
我需要从这个表中只有3排得到。它是每种类型中具有最高评级的一行。该领域的作用 - 是从三个值列表中定义具体角色的判别式:开发者(1),测试者(2),经理(3)。所以角色字段的值可以是1或2或3
我有表EMPLOYEE
有3个字段:相当棘手的SQL查询
EMPLOYEE(ROLE SMALLINT, RATING INTEGER, NAME VARCHAR)
我需要从这个表中只有3排得到。它是每种类型中具有最高评级的一行。该领域的作用 - 是从三个值列表中定义具体角色的判别式:开发者(1),测试者(2),经理(3)。所以角色字段的值可以是1或2或3
Postgres的特定短查询:
SELECT DISTINCT ON (role) role, name, rating
FROM employee
ORDER BY role, rating DESC
如果2员工具有相同的作用,并评价 - 其中一人将被随机选出。
这是一个基本的聚集查询(我假设你是新的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()
。
如果我正确理解你的问题,你想,每个角色,最高等级名称:
select role, rating, name
from employee as e1
where rating = (
select max(rating) from employee
where role = e1.role
)
的权利,如果你有两个员工具有相同的作用,并评价这是行不通的,虽然。在这种情况下,您需要在子查询中选择名称。
这应该是被接受的答案。 –