Как установить приоритет для определенного атрибута при сохранении порядка

Я хочу выбрать все строки таблицы carInventory, но чтобы бренды, у которых есть машина синего цвета, были первыми. После этого автомобили каждой марки сортируются по годам.

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

SELECT
 *, RANK() over(
    partition by colBrand
    order by case when colColor like '%blue%' then 1 else 0 end
    ) RANK FROM inventoryTable Order By Rank, colBrand, colYear

Вот как должны выглядеть таблицы. Стартовый стол

БрендДелатьЦветГод
ТойотаКороллаАтлантида Блю2015
ФордФокусБэйсайд Блю2016
ПоршеТайканСерый2019
ФольксвагенТаосСиний2015
ФольксвагенДжеттаБелый2020
ФордФокусКрасный ацтек2018

Результат поиска

БрендДелатьЦветГод
ФордФокусКрасный ацтек2018
ФордФокусБэйсайд Блю2016
ТойотаКороллаАтлантида Блю2015
ФольксвагенТаосСиний2020
ФольксвагенДжеттаБелый2015
ПоршеТайканСерый2019

В сторону: остерегайтесь ловушки '%foo%'. Сопоставление шаблона с '%blue%' будет соответствовать 'My toothpaste contains an abluent.'. Сопоставление слов требует разделения слов, что является нетривиальной задачей. В зависимости от ваших данных вам может сойти с рук ' ' + colColor + ' ' like '% blue %', хотя это не будет обрабатывать знаки препинания. Сколько слов содержит 'red'?

HABO 22.04.2022 23:45
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
1
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Интересно, может быть, ниже запрос может сделать то, что вам нужно

Я также сделал демонстрационная рабочий пример

 select *
from inventoryTable  i
order by 
case when exists ( select 1 from inventoryTable t 
          where t.colbrand=i.colbrand and t.colcolor like '%blue%') then 9999 
     else colYear end desc,colBrand asc, colyear desc

Хороший ответ должен включать объяснение, а также рабочий код.

Dale K 23.04.2022 01:32
Ответ принят как подходящий

Во-первых, в автомобильной промышленности термины «производитель» и «модель» используются для обозначения того, что вы называете брендом и изготовителем. Использование собственной терминологии может ввести многих в заблуждение.

Я думаю, если вы пропишете логику вашего заказа точнее и полнее, вам будет легче найти путь к решению. И это помогает быть последовательным. Что такое «Колбренд»? ColYear? IMO, вы оказываете всем медвежью услугу, предваряя имена столбцов избыточным префиксом. И здесь «столбец» означает «столбец»? Просто не надо!

Итак, кажется, вы хотите отсортировать по <брендам с синим транспортным средством/брендам без>, бренду, году выпуска по убыванию. Обратите внимание, что марка не включена в ваш заказ. И обратите внимание, что ваш Taos имеет 2015 год в таблице, но меняет этот год на другой в желаемом выводе. Это одна из причин, по которой вы должны опубликовать сценарий — он помогает избежать подобных опечаток и побуждает других помогать вам.

Итак, вот еще один способ добиться этого. CTE выбирает все бренды, которые имеют синий цвет. Вы просто выполняете внешнее соединение фактической таблицы с CTE, чтобы узнать, удовлетворяет ли бренд условию синего цвета. Используйте это знание в выражении CASE в предложении ORDER BY.

with blubr as (select distinct brand from @inventory where color like '%blue%')
select inv.brand, inv.make, inv.color, inv.year
  from @inventory as inv left join blubr on inv.brand = blubr.brand
order by case when blubr.brand is not null then 0 else 1 end, 
   inv.brand, inv.year desc
;

рабочий пример для демонстрации Обратите внимание, что в логике предыдущего ответа есть ошибка. Я добавил строку, чтобы проиллюстрировать это. Вы видите это? Это легко исправить для этого запроса. Этот запрос лучше? Не совсем, но, надеюсь, это поможет вам подумать о разных подходах к достижению одной и той же цели.

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