如何在维护顺序的同时为特定属性设置优先级
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 请注意,先前答案的逻辑存在缺陷。我添加了一行来说明它。你看到了吗?这是对该查询的简单修复。这个查询更好吗?不一定,但它希望能帮助您想到实现同一目标的不同方法。
我想 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”?只是不要!
所以您似乎想按
所以这里有另一种方法来实现这一点。 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 请注意,先前答案的逻辑存在缺陷。我添加了一行来说明它。你看到了吗?这是对该查询的简单修复。这个查询更好吗?不一定,但它希望能帮助您想到实现同一目标的不同方法。