如何在维护顺序的同时为特定属性设置优先级

How to set precedence to specific attribute while maintaining order

我想 select carInventory table 的所有行,但首先要有某种蓝色汽车的品牌。之后,每个品牌的汽车按年份排序。

我试图更改此 post 中给出的解决方案 但在我弄清楚排名后,我似乎无法将品牌放在一起

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

table 应该是这样的。 开始 Table

Brand Make Color Year
Toyota Corolla Atlantis Blue 2015
Ford Focus Bayside Blue 2016
Porshe Taycan Grey 2019
Volkswagen Taos Blue 2015
Volkswagen Jetta White 2020
Ford Focus Aztec Red 2018

搜索结果

Brand Make Color Year
Ford Focus Aztec Red 2018
Ford Focus Bayside Blue 2016
Toyota Corolla Atlantis Blue 2015
Volkswagen Taos Blue 2020
Volkswagen Jetta White 2015
Porshe Taycan Grey 2019

有意思,也许下面的查询可以满足你的需求

我也做了一个demo fiddle

 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

首先,汽车行业使用术语品牌和型号来指代您所说的品牌和品牌。使用您自己的术语会让很多人感到困惑。

我认为,如果您将订单逻辑编写得更准确、更完整,您将更容易找到解决问题的途径。它有助于保持一致。什么是“ColBrand”?科尔年?在 IMO 中,您通过在列名称前加上冗余前缀来损害每个人的利益。而这里的“col”指的是“column”?只是不要!

所以您似乎想按、品牌、年份降序排序。请注意,Make 不包含在您的订单中。请注意,您的 Taos 在 table 中有 2015 年,但在所需的输出中将那一年换成了另一年。这就是为什么您应该 post 脚本的原因之一 - 有助于避免这样的拼写错误并鼓励其他人帮助您。

所以这里有另一种方法来实现这一点。 CTE 选择所有具有蓝色的品牌。您只需将实际的 table 外部连接到 CTE 即可知道该品牌是否满足蓝色条件。在 ORDER BY 子句的 CASE 表达式中使用该知识。

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
;

fiddle to demonstrate 请注意,先前答案的逻辑存在缺陷。我添加了一行来说明它。你看到了吗?这是对该查询的简单修复。这个查询更好吗?不一定,但它希望能帮助您想到实现同一目标的不同方法。