Если ваши значения упорядочены в алфавитном порядке в реальном (как в вашем примере), это будет очень просто - вам нужно только упорядочить значения:
SELECT DISTINCT ON (id)
id,
type
FROM mytable m
ORDER BY id, type
демо: дб <> скрипка
Если вам не нужна таблица, в которой хранятся ранжированные значения и их ранжированный порядок. Или вы имитируете это с помощью подзапроса, как я:
SELECT DISTINCT ON (id)
id,
type
FROM mytable m
JOIN (VALUES (1, 'x'), (2, 'y'), (3, 'z')) AS r (rank_id,value)
ON r.value = m.type
ORDER BY id, r.rank_id
Если данные вашего типа действительно фиксированы, вы можете подумать о enum type , который является упорядоченным типом по умолчанию. Запрос будет выглядеть так, как показано выше:
демо: дБ <> скрипка
Но обратите внимание, что изменение перечислений (добавление, удаление, перестановка значений) может быть очень сложным. Поэтому рекомендуется, только если тип действительно фиксированный. В противном случае возьмите отдельную таблицу с внешними ключами, которая возвращает вас ко второй части.