是否可以使用 SQL 排名函数按以下顺序对数据进行排名
Is it possible to rank the data in following order using SQL ranking functions
我在 table 中有数据,需要按 Brand 列排序,并根据 ClassCode 更改进行排名。我尝试使用 ROW_NUMBER、RANK、DENSE_RANK 函数使用 PARTITION BY 但没有得到我需要的结果。
随着 ClassCode 的变化,等级应该增加,我不能为 ClassCode[ 使用 PARTITION BY =33=] 因为它改变了品牌的顺序。
示例table:
Code Brand ClassCode
101 Sony 201
103 LG 202
104 Nokia 203
107 Sony 201
108 Samsung 202
Table 数据需要按 Brand 排序并按 ClassCode 排序,如下所示:
要求的结果:
Code Brand ClassCode rnk
103 LG 202 1
104 Nokia 203 2
108 Samsung 202 3
101 Sony 201 4
107 Sony 201 4
注意:获得顺序和排名后,我需要将结果插入另一个 table。我知道应该只在 SELECT 语句中完成排序,但不幸的是,应用程序从 table 中选择数据,该数据已填充了所有顺序和排名逻辑。
Table data needs to be ordered by Brand and ranked by ClassCode
排名和排序是两种不同的东西,它们不必依赖于同一组列。
您可以使用以下查询按 ClassCode
排名,并按 Brand
排序:
select
t.*,
dense_rank() over(order by ClassCode) rnk
from mytable
order by Brand, Code
也就是说,要生成预期结果,您需要按 Brand
(而不是 ClassCode
)进行排名:
select
t.*,
dense_rank() over(order by Brand) rnk
from mytable
order by Brand, Code
这是一个间隙和孤岛问题,您要在其中尝试根据 code
顺序查找 classcode
更改的次数。
这应该return你想要的结果:
select t.*,
sum(case when prev_cc = classcode then 0 else 1 end) over (order by code) as ranking
from (select t.*, lag(classcode) over (order by code) as prev_cc
from t
) t
我在 table 中有数据,需要按 Brand 列排序,并根据 ClassCode 更改进行排名。我尝试使用 ROW_NUMBER、RANK、DENSE_RANK 函数使用 PARTITION BY 但没有得到我需要的结果。
随着 ClassCode 的变化,等级应该增加,我不能为 ClassCode[ 使用 PARTITION BY =33=] 因为它改变了品牌的顺序。
示例table:
Code Brand ClassCode
101 Sony 201
103 LG 202
104 Nokia 203
107 Sony 201
108 Samsung 202
Table 数据需要按 Brand 排序并按 ClassCode 排序,如下所示:
要求的结果:
Code Brand ClassCode rnk
103 LG 202 1
104 Nokia 203 2
108 Samsung 202 3
101 Sony 201 4
107 Sony 201 4
注意:获得顺序和排名后,我需要将结果插入另一个 table。我知道应该只在 SELECT 语句中完成排序,但不幸的是,应用程序从 table 中选择数据,该数据已填充了所有顺序和排名逻辑。
Table data needs to be ordered by Brand and ranked by ClassCode
排名和排序是两种不同的东西,它们不必依赖于同一组列。
您可以使用以下查询按 ClassCode
排名,并按 Brand
排序:
select
t.*,
dense_rank() over(order by ClassCode) rnk
from mytable
order by Brand, Code
也就是说,要生成预期结果,您需要按 Brand
(而不是 ClassCode
)进行排名:
select
t.*,
dense_rank() over(order by Brand) rnk
from mytable
order by Brand, Code
这是一个间隙和孤岛问题,您要在其中尝试根据 code
顺序查找 classcode
更改的次数。
这应该return你想要的结果:
select t.*,
sum(case when prev_cc = classcode then 0 else 1 end) over (order by code) as ranking
from (select t.*, lag(classcode) over (order by code) as prev_cc
from t
) t