2017-11-28 6 views
2

私のデータベースには、カテゴリフィールドが更新され、古い値が削除されていないエントリがいくつかあります。私は、定義した順序で、「最高」のカテゴリ値を持つエントリだけを保持したいと思います。カテゴリ値に優先順位を付けて重複を削除します

入力:

id | degree 
============= 
1 | Diploma 
1 | Bachelors 
1 | Masters 
2 | Diploma 
2 | Bachelors 

出力(希望):

id | degree 
============= 
1 | Masters 
2 | Bachelors 

は私が以前の値を上書きしようとする試みの最後の「最高」の値でCASEを使用してみましたが、それは動作しません。思惑通り。

SELECT 
    DISTINCT id, 
    (CASE 
     WHEN id = 'Diploma' THEN 'Diploma' 
     WHEN id = 'Bachelors' THEN 'Bachelors' 
     WHEN id = 'Masters' THEN 'Masters' 
    END) as degree 
FROM 
    academic_record 

この操作の方法はありますか?

+0

論理を説明できますか?マスターズ>学士>ディプロマを意味すると仮定するのは間違いありませんか? – Mureinik

+1

それは正しいです。論理は、それぞれのケースを順番にチェックしたい場合です。ケースが真であれば、値を設定します。次の場合は値を上書きすることがあります。 (これは最適ではないかもしれませんが、十分です。より良い方法は、値を設定する前にすべてのケースをチェックして、「置き換えられた」値を上書きする必要はありません。) – yunque

答えて

2

注文にはcaseを使用するのが適切です。私はrankをIDごとにクエリしてから、上位のIDを取得します:

SELECT id, degree 
FROM (SELECT id, 
       degree, 
       RANK() OVER (PARTITION BY id 
          ORDER BY CASE degree WHEN 'Diploma' THEN 1 
               WHEN 'Bachelors' THEN 2 
               WHEN 'Masters' THEN 3 
            END DESC) AS rn 
     FROM academic_record) t 
WHERE rn = 1 
+0

美しく動作します!ありがとうございました。 – yunque

関連する問題