共通表式(CTE)を利用して、a、b、c、d といった優先度を、それぞれ 1、2、3、4 に変換する方法が適切かと思います。
SQL
1WITH R (priority, rank) AS (
2 SELECT 'a', 1 FROM DUAL
3 UNION ALL SELECT 'b', 2 FROM DUAL
4 UNION ALL SELECT 'c', 3 FROM DUAL
5 UNION ALL SELECT 'd', 4 FROM DUAL
6)
7SELECT
8 E.column1,
9 ANY_VALUE(E.priority) KEEP (DENSE_RANK FIRST ORDER BY R.rank) priority
10FROM example_table E
11JOIN R ON E.priority = R.priority
12GROUP BY E.column1
あるいはINSTR
を使って変換する方法も考えられます。
SQL
1SELECT
2 column1,
3 ANY_VALUE(priority) KEEP (DENSE_RANK FIRST ORDER BY INSTR('abcd', priority)) priority
4FROM example_table
5GROUP BY column1
※ 以下のDDLを利用し、Oracle Database 21c で稼働確認しました。
SQL
1CREATE TABLE example_table (
2 column1 VARCHAR(10),
3 priority CHAR(1)
4);
5
6-- 例1
7INSERT INTO example_table (column1, priority) VALUES ('aaa', 'a');
8INSERT INTO example_table (column1, priority) VALUES ('aaa', 'b');
9INSERT INTO example_table (column1, priority) VALUES ('aaa', 'c');
10INSERT INTO example_table (column1, priority) VALUES ('aaa', 'd');
11INSERT INTO example_table (column1, priority) VALUES ('bbb', 'b');
12INSERT INTO example_table (column1, priority) VALUES ('bbb', 'c');
13INSERT INTO example_table (column1, priority) VALUES ('bbb', 'd');
14
15-- 例2
16INSERT INTO example_table (column1, priority) VALUES ('aaa', 'a');
17INSERT INTO example_table (column1, priority) VALUES ('aaa', 'c');
18INSERT INTO example_table (column1, priority) VALUES ('bbb', 'b');
19INSERT INTO example_table (column1, priority) VALUES ('bbb', 'c');
20INSERT INTO example_table (column1, priority) VALUES ('ccc', 'c');
21INSERT INTO example_table (column1, priority) VALUES ('ccc', 'd');
22
23-- 例3
24INSERT INTO example_table (column1, priority) VALUES ('aaa', 'c');
25INSERT INTO example_table (column1, priority) VALUES ('aaa', 'd');
26INSERT INTO example_table (column1, priority) VALUES ('bbb', 'b');
27INSERT INTO example_table (column1, priority) VALUES ('bbb', 'd');
28INSERT INTO example_table (column1, priority) VALUES ('ccc', 'a');
29INSERT INTO example_table (column1, priority) VALUES ('ccc', 'd');