排名与联盟
Rank versus Union
您好,我需要根据 where 子句中满足的条件对我的行进行排名。所以我写了查询
select 1 as priority, usr_fname, usr_lname from core_users where usr_fname = 'John' and usr_lname = 'smith' and suburb = '0162'
union
select 2 as priority, usr_fname, usr_lname from core_users where usr_fname = 'John' and usr_lname = 'smith' and usr_title = 'Mr'
union
select 3 as priority, usr_fname, usr_lname from core_users where usr_fname = 'John' and usr_lname = 'smith'
现在我的 TL 坚持我可以在这里使用 sql rank()/row_number()。有人可以指导如何吗?
如果你使用row_number()
,你可以获得超过3个值:
select usr_fname, usr_lname,
row_number() over (case when suburb = '0162' then 1
when usr_title = 'Mr' then 2
else 3
end) as priority
from core_users
where usr_fname = 'John' and usr_lname = 'smith' ;
您可以使用 dense_rank()
而不是 row_number()
获得同等的优先级。但是,如果数据中未显示所有三个组,则数字将为“1”或“1”和“2”。
然而,更简单的版本只使用 case
表达式并执行您想要的操作:
select usr_fname, usr_lname,
(case when suburb = '0162' then 1
when usr_title = 'Mr' then 2
else 3
end) as priority
from core_users
where usr_fname = 'John' and usr_lname = 'smith' ;
您的版本 returns 多次出现在同一行 -- 每个优先级都匹配一次。这个returns每一行只有一次,我猜这是你的实际意图。
您好,我需要根据 where 子句中满足的条件对我的行进行排名。所以我写了查询
select 1 as priority, usr_fname, usr_lname from core_users where usr_fname = 'John' and usr_lname = 'smith' and suburb = '0162'
union
select 2 as priority, usr_fname, usr_lname from core_users where usr_fname = 'John' and usr_lname = 'smith' and usr_title = 'Mr'
union
select 3 as priority, usr_fname, usr_lname from core_users where usr_fname = 'John' and usr_lname = 'smith'
现在我的 TL 坚持我可以在这里使用 sql rank()/row_number()。有人可以指导如何吗?
如果你使用row_number()
,你可以获得超过3个值:
select usr_fname, usr_lname,
row_number() over (case when suburb = '0162' then 1
when usr_title = 'Mr' then 2
else 3
end) as priority
from core_users
where usr_fname = 'John' and usr_lname = 'smith' ;
您可以使用 dense_rank()
而不是 row_number()
获得同等的优先级。但是,如果数据中未显示所有三个组,则数字将为“1”或“1”和“2”。
然而,更简单的版本只使用 case
表达式并执行您想要的操作:
select usr_fname, usr_lname,
(case when suburb = '0162' then 1
when usr_title = 'Mr' then 2
else 3
end) as priority
from core_users
where usr_fname = 'John' and usr_lname = 'smith' ;
您的版本 returns 多次出现在同一行 -- 每个优先级都匹配一次。这个returns每一行只有一次,我猜这是你的实际意图。