Различаются по столбцу, используя заказ - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть представление БД.

В этот момент он возвращает строки, которые могут иметь повторяющиеся записи в столбце id. Я хотел бы сделать следующее:

SELECT DISTINCT ON (id) USING DESCRIBED BELOW RULE -- of course it is not valid sql
  id
  type

type столбец может иметь 3 значения:

  • x
  • y
  • z

Если есть строки с одинаковыми id, но разными type, правило для DISTINCT следующее:

  • выберите строку с типом x first
  • выберите строку с типом y, если нет x
  • выберите строку с типом z, если нет x и нет y

Итак, если у меня есть 3 строки:

id    type
1     'y'
1     'x'
2     'z'

Ожидаемый результат будет

id    type
1     'x'
2     'z'

Есть ли способ достичь этого?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы можете поместить иерархию в CASE выражение в ORDER BY

SELECT DISTINCT ON (id) * 
FROM   ( VALUES (1, 'y'), 
                (1, 'x'), 
                (2, 'z') ) s(id, type) 
ORDER  BY id, 
          CASE type 
            WHEN 'x' THEN 1 
            WHEN 'y' THEN 2 
            WHEN 'z' THEN 3 
          END; 

Демо

0 голосов
/ 01 ноября 2018

Если ваши значения упорядочены в алфавитном порядке в реальном (как в вашем примере), это будет очень просто - вам нужно только упорядочить значения:

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 , который является упорядоченным типом по умолчанию. Запрос будет выглядеть так, как показано выше:

демо: дБ <> скрипка

Но обратите внимание, что изменение перечислений (добавление, удаление, перестановка значений) может быть очень сложным. Поэтому рекомендуется, только если тип действительно фиксированный. В противном случае возьмите отдельную таблицу с внешними ключами, которая возвращает вас ко второй части.

...