根据其他列中的条件更改 RANK() 的结果
Posted
技术标签:
【中文标题】根据其他列中的条件更改 RANK() 的结果【英文标题】:Change the result of RANK() based on conditions in other columns 【发布时间】:2018-10-04 07:25:15 【问题描述】:现在我有一个这样的红移表:
表 Project_team
Employee_ID Employee_Name Start_date Ranking Is_leader Is_Parttime_Staff
Emp001 John 2014-04-01 1 No No
Emp002 Mary 2015-02-01 2 No Yes
Emp003 Terry 2015-02-15 3 Yes No
Emp004 Peter 2016-02-05 4 No No
Emp004 Morris 2016-05-01 5 No No
最初没有员工排名。 我所做的是像这样使用 rank() 函数:
RANK() over (partition by Employee_ID,Employee_Name order by Start_date) as page_seq
但是,现在我想根据他们的状态来操纵排名。如果员工是领导者,那么他或她应该排在第一位。如果他或她是兼职员工,那么应该排在最后。表格应该是这样的:
Employee_ID Employee_Name Start_date Ranking Is_leader Is_Parttime_Staff
Emp003 Terry 2015-02-15 1 Yes No
Emp001 John 2014-04-01 2 No No
Emp004 Peter 2016-02-05 3 No No
Emp004 Morris 2016-05-01 4 No No
Emp002 Mary 2015-02-01 5 No Yes
我尝试使用 case 函数来像这样操作它
Case when Is_leader = true then Ranking = 1 else RANK() over (partition by Employee_ID,Employee_Name order by Start_date) End as page_seq.
但是它不起作用。
我需要根据其他列中的其他条件更改排名的过程是什么?
非常感谢!
【问题讨论】:
在相关窗口函数的over子句中使用case expression
。以下建议的解决方案使用此方法,但未说明实际解决方案。
【参考方案1】:
使用dense_rank()
demo
select *,dense_Rank() over(order by case when leader='yes' then 1 else 0 end desc, case when parmanent='yes' then 1 else 0 end)
from cte1
输出:
id name leader parmanent employeerank
1 A yes no 1
3 C no no 2
2 B no yes 3
【讨论】:
@fa06 非常感谢!但是仍然有一个问题,对于既不是 Is_leader 也不是 Is_Parttime_Staff 的其他行,我仍然希望将它们保持在原始顺序,即与 employee_id 一起排名。我该怎么做? 你的意思是两个值都没有 - 在这种情况下你想要什么?以上是关于根据其他列中的条件更改 RANK() 的结果的主要内容,如果未能解决你的问题,请参考以下文章