Вопрос

Допустим, мои отношения таковы

enter image description here

и я хотел отсортировать по рангу, но сначала A и B.Таким образом, мое отношение будет выглядеть следующим образом

enter image description here

Сначала я пытался просто создать два отношения, где я упорядочиваю их оба по рангу, затем объединяю два отношения, но в конечном итоге они просто перемешиваются.Я также пробовал использовать cases, но я не понимаю, как это работает.Я продолжал получать ошибки из-за смешивания символов с целыми числами.

Редактировать:Забыл упомянуть, что первое приведенное выше соотношение - это то, к чему я в конечном итоге прихожу после несколько сложного количества просмотров.Например, я создал два представления, одно из которых имеет только классы A и B, затем я упорядочил их по рангу.Второй просмотр - только классы C, упорядоченные по рангу.Потом я объединил их, но они просто смешались.

Это было полезно?

Решение

Вам нужен только CASE выражение в ORDER BY, чтобы разделить строки на две группы, так что строки с классом "A" или "B" помещаются в первую группу (1) и все остальные во втором (2):

ORDER BY 
    CASE WHEN class IN ('A', 'B') THEN 1 ELSE 2 END,
    rank ;

Другие советы

Я собираюсь привести вам один пример способа сделать это, где я использую CTE, которые доступны во многих базах данных, в частности в PostgreSQL, с которым я наиболее хорошо знаком.

CTEs и the WITH пункт

КТЕс позволяют вам формировать временные структуры, подобные таблицам с одним запросом, но поскольку вы можете заставить CTE полагаться друг на друга в одном запросе, это обеспечивает удобный и понятный способ сделать ваш запрос полупроцедурным.

В вашем случае я бы попробовал

WITH AB_results AS(
  SELECT class, rank, 1 AS hidden_rank
  FROM my_relation
  WHERE class IN ('A','B')
),
Non_AB_results AS(
  SELECT class, rank, 2 AS hidden_rank
  FROM my_relation
  WHERE class NOT IN ('A','B')
)
SELECT COALESCE(AB_results.class,Non_AB_results.class), rank
FROM AB_results
FULL OUTER JOIN Non_AB_results
USING(hidden_rank,rank)
ORDER BY hidden_rank, rank;

Я попытаюсь собрать здесь SQLFiddle за пару минут, просто чтобы убедиться, что я не ошибся в каком-то своем запросе.:P

РЕДАКТИРОВАТЬ:Я действительно допустил небольшую ошибку.Пытаюсь прояснить это на примере, пока мы говорим.

ПРАВКА 2:Теперь ошибка исправлена!К сожалению, прямо сейчас у SQLFiddle возникли небольшие проблемы, но здесь это ссылка на SQLFiddle для некоторого тестирования.

Пожалуйста, обратите внимание возможно, я решил это не самым элегантным из возможных способов, но это должно решить ваши проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top