PostgreSQL - сортировать по array_position и отличать по другому столбцу - PullRequest
1 голос
/ 16 июня 2020

У меня есть запрос, который выглядит следующим образом (фактический запрос и таблицы более сложные) :

SELECT item.other_uuid, item.uuid, category.name
FROM item, category
WHERE ...
ORDER BY array_position(ARRAY[{'CDX', 'KDJ', 'PLM', 'OLA', 'OWK', 'CAT'}]::uuid[], item.uuid), category.name;

Это дает мне список имен категорий в определенном порядке (uuid порядок, переданный массивом). Например:

789 CDX "Cat D"
123 KDJ "Cat A"
456 PLM "Cat B"
123 OLA "Cat F"
456 OWK "Cat X"
123 CAT "Cat Z"

Я бы хотел добавить в этот запрос DISTINCT ON 'item.other_uuid'. Таким образом, итоговый список будет:

789 CDX "Cat D"
123 KDJ "Cat A"
456 CAT "Cat B"

Как я могу этого добиться? Postgres хочет, чтобы ORDER BY & DISTINCT соответствовал, но это был бы неправильный порядок для моего запроса.

Я пытался сделать это подзапросом и использовать DISTINCT в основном запросе, но порядок не соответствует ' t поддерживается ...

1 Ответ

1 голос
/ 17 июня 2020

Здесь есть два компонента: какой член выбирается для каждой группы "other_uuid" и в каком порядке представлены эти выбранные строки. Если вы sh управляете обоими этими элементами, вам может потребоваться внутренний запрос и внешний запрос, каждый со своим ORDER BY.

select * from (
   SELECT distinct on (other_uuid)other_uuid, uuid, name
   FROM ...
   ORDER BY other_uuid, array_position(ARRAY['CDX', 'KDJ', 'PLM', 'OLA', 'OWK', 'CAT']::text[], uuid), name
) foo order by array_position(ARRAY['CDX', 'KDJ', 'PLM', 'OLA', 'OWK', 'CAT']::text[], uuid);

Уродливое повторение выражения array_position. Есть способы избежать этого, но они тоже безобразны.

...