我有一个表employees
,其中包含列:
company_id
,id
,opt_state
(ceased_membership
,ignition
,opted_out
,opted_in
),opt_out_on
。我想查询所有员工opt-state
为in ('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;
答案 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。