sql >> データベース >  >> RDS >> Oracle

Oracle SQL:重複する CLIENTKEY を見つけて特定のレコードを 1 つ表示する

    各行にランキングを割り当てるサブクエリを使用して、重複キー (1 つの KB とそれ以外のキー) がある場合、KB 行が上位にランク付けされるようにすることができます。そしてそれをフィルタリングします:

    -- CTE for sample data
    with your_table (clientkey, clientname, department, hostkey) as (
      select '0201967/6', 'PPBOP1BOP01-JO,BLOGS', 'KB', 'PPBOP1BOP01/MSC/PPBOP1BOP01/2/B1KI0' from dual
      union all
      select '0201967/6', 'PPBOP1BOP01-JO,BLOGS', 'BS', 'PPBOP1BOP01/MSC/PPBOP1BOP01/2/B1KI0' from dual
      union all
      select '0024028/2', 'PPBOP1BOP01-FOO,BAR', 'KB', 'PPBOP1BOP01/MSC/PPBOP1BOP01/2/B2KI0' from dual
      union all
      select '0024028/2', 'PPBOP1BOP01-FOO,BAR', 'BS', 'PPBOP1BOP01/MSC/PPBOP1BOP01/2/B2KI0' from dual
      union all
      select '1746947/1', 'BSM1BSM03-THING,BOB', 'BS', 'BSM1BSM03/BSHVS/BSM1BSM03/2/B1KI0' from dual
      union all
      select '1612105/1', 'WIBU1IBU03-TREE,GREEN', 'BS', 'WIBU1IBU03/SHVS/WIBU1IBU03/3/B1KI0' from dual
    )
    -- actual query
    select clientkey, clientname, department, hostkey
    from (
      select clientkey, clientname, department, hostkey,
        rank () over (partition by clientkey
          order by case when department = 'KB' then 0 else 1 end) as rnk
      from your_table
    )
    where rnk = 1;
    
    CLIENTKEY CLIENTNAME            DE HOSTKEY                            
    --------- --------------------- -- -----------------------------------
    0024028/2 PPBOP1BOP01-FOO,BAR   KB PPBOP1BOP01/MSC/PPBOP1BOP01/2/B2KI0
    0201967/6 PPBOP1BOP01-JO,BLOGS  KB PPBOP1BOP01/MSC/PPBOP1BOP01/2/B1KI0
    1612105/1 WIBU1IBU03-TREE,GREEN BS WIBU1IBU03/SHVS/WIBU1IBU03/3/B1KI0 
    1746947/1 BSM1BSM03-THING,BOB   BS BSM1BSM03/BSHVS/BSM1BSM03/2/B1KI0  
    

    これにより、他の部門で重複が発生する可能性があり、それらすべての行が含まれます。 KB の重複のみを除外します。




    1. Microsoft Sync Framework - パフォーマンスとスケーラビリティ

    2. 行を分離するための更新にselect...を使用する最小限の例

    3. mysqlレコードの削除がcodeIgniterで機能していません

    4. MySQL、ORDER BY挿入順序、並べ替え列なし