首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排除重复记录

排除重复记录
EN

Stack Overflow用户
提问于 2019-07-25 18:55:43
回答 1查看 41关注 0票数 0

我有一个EmployeeList表,它由公司表和员工表中的数据组成。员工可以同时在多个公司中活动,因此我需要一个查询,该查询仅根据特定的场景从其中一家公司中选择员工的记录,我将在下面介绍该查询。

  1. 无名氏在初级公司和二级公司都很活跃。我只需要汇报一间公司的纪录,而忽略了他在第二间公司的纪录。
  2. 无名氏只活跃在二级公司,因此他在该公司的记录需要报告。
  3. 无名氏昨天在一级公司和二级公司都很活跃。今天,他从一家公司被解雇,所以他在二级公司的记录需要报告。

我试图排除任何记录,其中公司是‘二级公司’,员工在EmployeeList上被报告了两次,换句话说,他们同时在两家公司都很活跃,但这不符合场景# 3中规定的参数。

代码语言:javascript
复制
DELETE FROM EmployeeList 
WHERE CompanyName = 'Secondary Company'
AND EmployeeID IN (SELECT EmployeeID 
                   FROM EmployeeList 
                   GROUP BY EmployeeID 
                   HAVING COUNT(1) > 1
                  );

根据我所包含的3种方案所设定的参数,每个员工只应报告一条记录。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-25 19:36:15

你说这是一种报告需求,而不是存储需求,所以如果这是真的,我肯定不会建议任何删除操作。

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

您可能想要考虑执行一个cte或子查询,根据它是否是主记录来执行每一行的排序。这将被过滤为仅包括活动记录。然后,在该cte或子查询之外,为每个员工选择所有具有秩=1的行。

我对您的表结构和命名做了一些假设,但您可以酌情调整以下内容:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57208550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档