首页 > 解决方案 > 等级与联盟

问题描述

嗨,我需要根据 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()。有人可以指导如何吗?

标签: sqlrank

解决方案


如果你使用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' ;

您的版本多次返回同一行 - 每个匹配的优先级一次。这只会返回每行一次,我猜这是您的实际意图。


推荐阅读