相当棘手的SQL查询
我的表EMPLOYEE包含3个字段:相当棘手的SQL查询,sql,postgresql,Sql,Postgresql,我的表EMPLOYEE包含3个字段: EMPLOYEE(ROLE SMALLINT, RATING INTEGER, NAME VARCHAR) 我只需要从这张桌子上拿三排。它是每种类型中评级最高的一行。字段的角色-是从三个值列表中定义特定角色的判别式:DEVELOPER1、TESTER2、manager3。因此,角色字段的值可以是1、2或3。这是一个基本的聚合查询,我假设您是SQL新手: select role, max(rating) from employee group by role
EMPLOYEE(ROLE SMALLINT, RATING INTEGER, NAME VARCHAR)
我只需要从这张桌子上拿三排。它是每种类型中评级最高的一行。字段的角色-是从三个值列表中定义特定角色的判别式:DEVELOPER1、TESTER2、manager3。因此,角色字段的值可以是1、2或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
此版本仅返回一行,即使存在重复的行。如果要在有多个最大值相同的行时使用所有行,请使用秩而不是行数。这是一个基本的聚合查询,我假设您是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
此版本仅返回一行,即使存在重复的行。如果您希望在有多个具有相同最大值的行时使用所有行,请使用秩而不是行号。如果我正确理解您的问题,您希望每个角色的名称具有最高评级:
select role, rating, name
from employee as e1
where rating = (
select max(rating) from employee
where role = e1.role
)
但是,如果您有两名员工具有相同的角色和评级,这将不起作用。在这种情况下,您需要在子查询中选择名称。如果我正确理解了您的问题,您需要为每个角色选择评分最高的名称:
select role, rating, name
from employee as e1
where rating = (
select max(rating) from employee
where role = e1.role
)
但是,如果您有两名员工具有相同的角色和评级,这将不起作用。在这种情况下,您需要在子查询中选择名称。Postgres特定的短查询:
SELECT DISTINCT ON (role) role, name, rating
FROM employee
ORDER BY role, rating DESC
如果两名员工具有相同的角色和评级-将随机挑选其中一名。Postgres特定简短查询:
SELECT DISTINCT ON (role) role, name, rating
FROM employee
ORDER BY role, rating DESC
如果两名员工具有相同的角色和评级,则将随机挑选其中一名。姓名fild在哪里?语句GROUP BY role与SELECT中的NAME不能正常工作我认为行号需要按role@dotjoe . . . 非常感谢。我搞定了,名字菲尔德在哪?语句GROUP BY role与SELECT中的NAME不能正常工作我认为行号需要按role@dotjoe . . . 非常感谢。我修好了。