0

以下のようなデータセットがあります。

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 が複数のマネージャーにタグ付けされている場合、彼がいずれかのマネージャーに としてタグ付けされているかどうかを確認する必要がありACTIVEます。同じことを考慮すべきではありません。ステータスが<> ACTIVEその Emp のレコードを取得します。例:- エイミーの場合、ステータスのあるレコードを除外する必要があり ACTIVEます。とでレコードを取得する必要がINSERVICEあり ますINACTIVE
  • Emp が複数のマネージャにタグ付けされているが、その全員が INACTIVE ステータスである場合、max( MODIFIED_DATE) レコードを残して残りのレコードをフェッチします。例: キースの場合、両方のマネージャ レコードのステータスが 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 
4

1 に答える 1

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

ここにフィドルがあります

于 2012-07-01T06:06:25.570 に答える