select ssn, count(*)
from (
select ssn, employee_id, is_active
from employee
where is_active ='Y'
)
group by ssn
having count(*) > 1
我想修改此查询以查找表中存在的所有ssn
,但不止一次,但具有不同的employee_id
,至少一个记录的is_active
为是的。
答案 0 :(得分:1)
如果您需要所有详细信息,则:
SELECT ssn,
employee_id,
is_active
FROM (
SELECT ssn,
employee_id,
is_active,
COUNT( DISTINCT employee_id ) OVER ( PARTITION BY ssn ) AS num_emps,
COUNT( CASE is_active WHEN 'Y' THEN 1 END ) OVER ( PARTITION BY ssn )
AS num_active
FROM employee
)
WHERE num_emps > 1
AND num_active > 0
如果您只想要ssn
,则:
SELECT ssn
FROM employee
GROUP BY ssn
HAVING COUNT( DISTINCT employee_id ) > 1
AND COUNT( CASE is_active WHEN 'Y' THEN 1 END ) > 0;
答案 1 :(得分:1)
不需要子查询或CTE,只需group by
和having
:
select ssn, count(*)
from employee
group by ssn
having min(employee_id) <> max(employee_id) and
sum(case when is_active ='Y' then 1 else 0 end) >= 1;
答案 2 :(得分:0)
您可以使用窗口COUNT
来获取不同的雇员数量,并使用SUM
来至少在活动状态下进行处理:
WITH cte AS(
select ssn, employee_id,
COUNT(DISTINCT employee_id) OVER(PARTITION BY ssn) AS cnt,
SUM(CASE WHEN is_active ='Y' THEN 1 ELSE 0 END) OVER(PARTITION BY ssn) AS s_active
from employee
)
SELECT *
FROM cte
WHERE cnt > 1 AND s_active > 1;
答案 3 :(得分:0)
如果我理解正确,应该这样做
select TMP.*
from (
select CASE WHEN MIN(employee_id) OVER( PARTITION BY ssn) <>
MAX(employee_id) OVER( PARTITION BY ssn) THEN 'Y'
ELSE 'N'
END AS hasMultipleDistinctEmployees,
CASE WHEN MAX(CASE WHEN is_active = 'Y' THEN 1 ELSE 0 END) OVER
( PARTITION BY ssn ) = 1 THEN 'Y'
ELSE 'N'
END AS hasAtLeaseOneActive,
ssn, employee_id, is_active
from employee
) TMP
WHERE hasMultipleDistinctEmployees = 'Y'
AND hasAtLeaseOneActive = 'Y'