根据其他列中的条件更改 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() 的结果的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询如何对增量键RANK中的相同结果进行单独分组

根据其他列中的条件更新一列中的值

Python Pandas根据多个其他列中的条件替换一列中的值[重复]

R:一次根据一列中的条件将整行推送到NA

根据第 1 列中的查找结果返回第 2 列中的范围

如何根据其他列中的条件从某个 ID 中选择所有值?