Иногда нужно сортировать записи таблицы с некоторым собственным приоритетом. Под словом «некоторым» имеется ввиду несколько конкретных уникальных значений столбца, а не все возможные уникальные значения этого столбца. Хотя вы можете настроить сортировку по всем уникальным значениям.
Мы рассмотрим решение, в котором исходная таблица будет иметь 7 уникальных значений, но они будут повторяться до 19 записей. Значения в столбце будут перемешаны, чтобы имитировать реальный случай работы с таблицей в базе данных.
«Перемешанность» нам будет гарантировать функция «unnest()», которая умеет разворачивать SQL-массивы значений в табличный формат. Для краткости она будет называться «T«.
Механизм своей сортировки будет реализован через вспомогательную таблицу «MYSORT«. Эта таблица может быть зарегистрирована у вас в базе, либо вы также сможете её создать через «unnest()» по SQL-массиву.
Мы сделаем свой порядок для трёх значений — 2,5,4. Именно в такой последовательности.
Для независимого объявления таблиц будет использовано предложение WITH. После объявления мы будем соединять таблицы «T» и «MYSORT» при помощи «JOIN». В самом конце мы укажем в предложении «ORDER BY» столбец «sortindex«, который получил данные из «with ordinality«.
-- Объявление таблиц with T(customerid) as ( -- 19 записей в таблице "T", перемешанные данные (частый случай) select * from unnest(array[1,2,1,3,2,2,4,5,6,1,2,3,4,2,5,4,3,7,6]) ), MYSORT(customerid, sortindex) as ( -- 3 значения собственной сортировки в таблице "MYSORT" select * from unnest(array[2,5,4]) with ordinality ) -- Соединение таблиц select * from T left join MYSORT on (MYSORT.customerid = T.customerid) order by MYSORT.sortindex asc, T.customerid asc;
Важный момент. В таблице «MYSORT» должны быть только уникальные значения. Результат своей сортировки.

Таблица с новой сортировкой по полю «customerid«.
| customerid | customerid | sortindex |
|---|---|---|
| 2 | 2 | 1 |
| 2 | 2 | 1 |
| 2 | 2 | 1 |
| 2 | 2 | 1 |
| 2 | 2 | 1 |
| 5 | 5 | 2 |
| 5 | 5 | 2 |
| 4 | 4 | 3 |
| 4 | 4 | 3 |
| 4 | 4 | 3 |
| 1 | ||
| 1 | ||
| 1 | ||
| 3 | ||
| 3 | ||
| 3 | ||
| 6 | ||
| 6 | ||
| 7 |