根据其他列中的条件更改RANK()的结果

时间:2018-10-04 07:25:16

标签: sql amazon-redshift ranking row-number

现在我在redshift中有一个这样的表:

表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. 

但是它不起作用。

我需要根据其他列中的其他条件更改排名的过程是什么?

非常感谢!

1 个答案:

答案 0 :(得分:1)

使用density_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