通过确定分类值的优先级来删除重复项

Remove duplicates by prioritising a categorical value

我的数据库中有一些条目的分类字段已更新,但旧值未被删除。我只想按照我定义的顺序保留具有 "highest" 分类值的条目。

输入:

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

输出(期望):

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

我尝试使用带有 "highest" 值的 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

这个操作有方法吗?

使用case进行排序是正确的想法。我会为每个 id 查询 rank,然后取最上面的:

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