PostgreSQL | Как сделать свой порядок сортировки?

PostgreSQL | Как сделать свой порядок сортировки?

Иногда нужно сортировать записи таблицы с некоторым собственным приоритетом. Под словом «некоторым» имеется ввиду несколько конкретных уникальных значений столбца, а не все возможные уникальные значения этого столбца. Хотя вы можете настроить сортировку по всем уникальным значениям.

Мы рассмотрим решение, в котором исходная таблица будет иметь 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» должны быть только уникальные значения. Результат своей сортировки.

PostgreSQL - собственная сортировка через JOIN
PostgreSQL — собственная сортировка через JOIN

Таблица с новой сортировкой по полю «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