Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相当棘手的SQL查询_Sql_Postgresql - Fatal编程技术网

相当棘手的SQL查询

相当棘手的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包含3个字段:

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 . . . 非常感谢。我修好了。