【问题标题】:Identify duplicate Records Based On Different Status in oracle根据oracle中的不同状态识别重复记录
【发布时间】:2012-07-01 09:30:18
【问题描述】:

我的数据集如下:

EMP_NAME   MGRNAME    STATUS    MODIFIED_DATE 
---------------------------------------------------
Amy        John       ACTIVE    01/15/2012 00:00:00 
Amy        Ken        INSERVICE 06/08/2000 00:00:00 
Amy        Tom        INACTIVE  04/02/2010 00:00:00 
Ron        David      ACTIVE    01/15/2008 00:00:00 
Keith      Jack       INACTIVE  08/10/2005 00:00:00 
Keith      Cat        INACTIVE  04/30/2008 00:00:00 
Keith      Ken        INACTIVE  02/04/2010 00:00:00
Mary       Stephen    INACTIVE  10/18/2010 00:00:00 

现在,我应该根据以下条件识别重复的行:

  • 如果一个 Emp 有 1 个 Mgr 标记,那么我们不应该考虑相同。 例如:- 罗恩,玛丽
  • 如果一个 Emp 已被标记为多个 Manager,那么我们需要检查 如果他被任何经理标记为ACTIVE,那么我们应该 不考虑一样。获取该 Emp 的状态为 <> ACTIVE 的那些记录。例如:- 对于 Amy,我们应该排除记录 ACTIVE 状态。我们应该使用INSERVICEINACTIVE
  • 如果一个 Emp 已被标记到多个 Manager,但他与所有 Manager 都处于 INACTIVE 状态,则保留 max(MODIFIED_DATE) 记录并获取剩余记录 例如:- 对于 Keith,由于 Mgr 记录的 Status 都是 INACTIVE,因此获取 (MODIFIED_DATE) 记录,它们是 08/10/2005 00:00:0004/30/2008 00:00:00

最终输出应如下所示:

EMP_NAME   MGRNAME     STATUS      MODIFIED_DATE 
------------------------------------------------------
Amy        Ken         INSERVICE   06/08/2000 00:00:00 
Amy        Tom         INACTIVE    04/02/2010 00:00:00 
Keith      Jack        INACTIVE    08/10/2005 00:00:00 
Keith      Cat         INACTIVE    04/30/2008 00:00:00 

【问题讨论】:

    标签: sql oracle oracle10g


    【解决方案1】:

    试试这个:

    SELECT EMP_NAME ,  MGRNAME ,   STATUS  ,  MODIFIED_DATE
    FROM (
    SELECT your_table.*,
    rank() over (partition BY EMP_NAME ORDER BY decode(STATUS,'ACTIVE', to_date('31129999', 'ddmmyyyy'), MODIFIED_DATE) DESC ) r FROM your_table
    ) t
    WHERE r > 1
    

    Here 是个小提琴

    【讨论】:

      猜你喜欢
      • 2020-08-01
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多