如何编写一个查询,返回不超过5人工作的部门的经理的id?(PostgreSQL)

ztmd8pv5  于 2023-03-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(140)

如何编写一个查询来返回不超过5人工作的部门中经理的id?
我有一个数据表员工

id integer- id员工
name char- name employee
department_id integer-员工所在部门的id
chief_flg boolean-员工处于领导职位的标志
birth_dt date-出生日期
薪资整数-员工薪资

我试着写这样的查询(PostgreSQL),但我认为你可以通过HAVING做一些事情

SELECT COUNT(e.id)<5, e.id as id_column
FROM employee AS e
WHERE chief_flg = 'True'
GROUP BY e.id
92vpleto

92vpleto1#

您的查询,不需要有:

select e.* from 
FROM employee AS e
join (SELECT COUNT(*), e.department_id
        FROM employee AS e
        WHERE chief_flg = 'True'
        GROUP BY e.department_id) mng
    on (mng.department_id = e.department_id and mng.cc <= 5)
WHERE chief_flg = 'True'

而不是加入内部选择,即计算部门中的员工数量。

qf9go6mv

qf9go6mv2#

有几种不同的方法可以做到这一点。可以考虑的一种方法是:

SELECT c.id
FROM employee c INNER JOIN employee e
  ON c.department_id = e.department_id
WHERE c.chief_flag = True
GROUP BY c.id
HAVING COUNT(*) <= 5

基本思想是将主管(c.chief_flag = True)加入到同一个部门(c.department_id = e.department_id)的所有员工中。如您所建议的,然后可以使用HAVING COUNT(e.id) <= 5限制为5个或更少员工的部门。
一个可能更容易遵循的替代方案(尽管可能性能较低):

SELECT c.id
FROM employee c
WHERE chief_flag = True
 AND (SELECT count(*) FROM employee e WHERE e.department_id = c.department_id) <= 5

这将获取所有具有chief_flag = True的行,并检查其部门中的员工数量是否为5或更少。
另一个选项类似于:

SELECT id
(
 SELECT id, chief_flag, count(*) OVER (PARTITION BY department_id) dep_count
 FROM employee
) mt
WHERE chief_flag = True AND dep_count <= 5

这类似于此问题的另一个答案(计算每个部门的员工数量),但在子查询中使用了一个窗口函数。
你现有的尝试将不起作用(即使你清理语法),因为你只查看一次表,并限制为chief_flg = 'True'。一旦你将查询限制为只考虑酋长,你就没有办法计算其他雇员。这就是为什么大多数解决方案要么连接,使用子查询,要么使用窗口函数。

相关问题