sql - 等级与联盟
问题描述
嗨,我需要根据 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' ;
您的版本多次返回同一行 - 每个匹配的优先级一次。这只会返回每行一次,我猜这是您的实际意图。
推荐阅读
- rabbitmq - RabbitMQ - 我可以通过自定义属性设置限制吗
- javascript - Javascript 未使用 XAMPP 执行
- variables - 使用 jq 范围变量输入新的 jq 过滤器
- scala - 如何在 Scala 中为列表实现自定义尾递归映射
- python - Kmeans 返回的集群的可视化
- excel - 循环遍历可变范围
- java - 是否可以阻止 JVM 访问特定的 URL?
- haskell - 如何只修改记录的一个字段而不完全重写它?
- python - Windows 10 上的 HubbleStack 需要 Windows 10 的 top.nova 文件
- python - 绑定方括号 [ 与 tkinter