根据oracle中的不同状态识别重复记录

时间:2012-06-29 20:47:52

标签: sql oracle oracle10g

我的数据集如下:

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个经理标记,那么我们不应该考虑相同。 例如: - 罗恩,玛丽
  • 如果Emp已被标记为多个经理,那么我们需要检查 如果他被标记为任何经理ACTIVE,那么我们应该 不要考虑相同。获取该Emp的状态为<> ACTIVE的记录。例如: - 对于艾米,我们应该排除记录 ACTIVE状态。我们应该使用INSERVICE和。来获取记录 INACTIVE
  • 如果已将Emp标记为多个管理员,但他处于所有管理员的非活动状态,则保留最大(MODIFIED_DATE)记录并获取剩余记录 例如: - 对于Keith,由于Mgr记录状态为非活动状态,因此获取MODIFIED_DATE08/10/2005 00:00:00
  • 的(04/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 

1 个答案:

答案 0 :(得分:0)

试试这个:

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是一个小提琴