【问题标题】:Exclusion of Duplicate Records排除重复记录
【发布时间】:2019-07-25 18:55:43
【问题描述】:

我有一个 EmployeeList 表,其中包含来自 Company 表和 Employee 表的数据。一个员工可以同时在多个公司中处于活动状态,因此我需要一个查询,根据某些场景仅从其中一个公司中选择员工的记录,我将在下面介绍。

  1. John Doe 在主要公司和次要公司都很活跃。我只需要报告他在初级公司的记录,而忽略他在二级公司的记录。

  2. John Doe 仅在二级公司活跃,因此需要报告他在该公司的记录。

  3. John Doe 昨天在主要公司和次要公司都很活跃。今天,他被第一公司解雇了,所以他在第二公司的记录需要报告。

我已尝试排除公司为“次要公司”且员工在 EmployeeList 中被报告两次的任何记录,换句话说,他们同时在两家公司中都处于活动状态,但这不符合规定的参数按场景 #3。

DELETE FROM EmployeeList 
WHERE CompanyName = 'Secondary Company'
AND EmployeeID IN (SELECT EmployeeID 
                   FROM EmployeeList 
                   GROUP BY EmployeeID 
                   HAVING COUNT(1) > 1
                  );

根据我包含的 3 个场景中规定的参数,每个员工只应报告一条记录。

【问题讨论】:

  • 我很困惑。您是在尝试修改数据还是只是根据您的规则执行SELECT
  • 如果记录处于非活动状态,您真的要删除记录,还是希望视图显示每个员工中的一个以及他们在表中处于活动状态的条件?还有表中的字段是什么,需要返回所有字段吗?
  • 您如何知道哪家公司是给定员工的主要公司?当然,您的数据并没有真正使用“主要公司”作为公司名称来识别它!

标签: sql sql-server


【解决方案1】:

您将其表述为报告需求,而不是存储需求,所以如果这是真的,我当然不会建议任何删除操作。

另外,我注意到 The Gambill 的评论并意识到“二级公司”存储在“公司名称”中。正如他所说,你必须对什么构成一家主要公司有更好的标准。在这个答案中,我假设您有一个名为“isPrimaryCompany”的字段。

您可能需要考虑执行 cte 或子查询,它根据每行是否是主记录来执行排名。这将被过滤为仅包括活动记录。然后,在该 cte 或子查询之外,为每个员工选择 rank = 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 = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    相关资源
    最近更新 更多