找到所有处于特定状态的员工的所有公司

时间:2018-03-22 17:15:49

标签: postgresql

我有一个表employees,其中包含列:

  • company_id
  • id
  • opt_stateceased_membershipignitionopted_outopted_in),
  • opt_out_on

我想查询所有员工opt-statein ('ceased_membership', 'ignition', 'opted_out')的所有公司以及上次员工离职时的日期opt_out_on

我试过这个,但它没有工作

select company_id from employees where id=all(select id from
     employees 
      where opt_state in ('ceased_membership', 'ignition','opted_out')

然后我在下面写了这个查询,它运作得很好,给了我正在寻找的解决方案。但是,我想在这里询问是否可以采用不同的方式,更优雅地做到这一点。

SELECT
  e.company_id
  , max_opt_out
FROM (
       SELECT DISTINCT
         company_id
         , count(id)
           OVER (
             PARTITION BY company_id ) opt_out
       FROM employees
       WHERE opt_state IN ('ceased_membership', 'ignition', 'opted_out')) e
  LEFT JOIN (
              SELECT
                company_id
                , count(id)       opt_in
                , max(opt_out_on) max_opt_out
              FROM employees
              GROUP BY company_id) S
    ON e.company_id = s.company_id
WHERE e.opt_out = s.opt_in;

2 个答案:

答案 0 :(得分:1)

我说你想为每个只有一组州员工的公司查询最大out_out_on,这意味着没有任何员工不在一组州内。< / p>

所以,翻译成SQL:

select company_id, max(opt_out_on)
from employees e
where not exists(
    select 1 from employees
    where company_id=e.company_id
    and opt_state not in ('ceased_membership', 'ignition','opted_out')
)
group by company_id;

答案 1 :(得分:1)

这似乎是使用HAVING子句的好时机

SELECT company_id, max(opt_out_on)
  FROM employees e
  GROUP BY company_id 
  HAVING bool_and( opt_state in ('ceased_membership', 'ignition','opted_out'));

HAVING有点像WHERE,但条件适用于整个GROUPS

bool_and是一个agregate函数,仅当组中的所有记录都为true时才为true。