我有一个EmployeeList表,它由公司表和员工表中的数据组成。员工可以同时在多个公司中活动,因此我需要一个查询,该查询仅根据特定的场景从其中一家公司中选择员工的记录,我将在下面介绍该查询。
我试图排除任何记录,其中公司是‘二级公司’,员工在EmployeeList上被报告了两次,换句话说,他们同时在两家公司都很活跃,但这不符合场景# 3中规定的参数。
DELETE FROM EmployeeList
WHERE CompanyName = 'Secondary Company'
AND EmployeeID IN (SELECT EmployeeID
FROM EmployeeList
GROUP BY EmployeeID
HAVING COUNT(1) > 1
);根据我所包含的3种方案所设定的参数,每个员工只应报告一条记录。
发布于 2019-07-25 19:36:15
你说这是一种报告需求,而不是存储需求,所以如果这是真的,我肯定不会建议任何删除操作。
另外,我注意到了Gambill的评论,并意识到“第二公司”存储在“公司名称”中。正如他所说,你必须有更好的标准来衡量什么是主要公司。在这个答案中,我假设您有一个名为“isPrimaryCompany”的字段。
您可能想要考虑执行一个cte或子查询,根据它是否是主记录来执行每一行的排序。这将被过滤为仅包括活动记录。然后,在该cte或子查询之外,为每个员工选择所有具有秩=1的行。
我对您的表结构和命名做了一些假设,但您可以酌情调整以下内容:
with
ranked as (
select *,
[rank] = row_number() over(
partition by employeeId
order by case when isPrimaryCompany = 1 then 0 else 1 end
)
from EmployeeList -- which is not really at the 'employee' level
where status = 'active'
)
select *
from ranked
where rank = 1https://stackoverflow.com/questions/57208550
复制相似问题