【发布时间】:2020-12-22 18:57:43
【问题描述】:
例如,下面有一个表格:
ID NAME Company StartDate EndDate Status
--------------------------------------------------------------------------------------
50 Bob ABC 11-15-2016 02-05-2017 Former
50 Bob XYZ 05-06-2014 05-06-2015 Former
50 Bob EFG 06-10-2019 NULL Active
50 Bob LMN 07-05-2019 NULL Active
我试图按降序列出他们最近的 3 个工作,因此他们的“活动”工作将排在第一位,但如果他们有 2 个“活动”工作,如上面的示例,我只想拉“活动”具有最近开始日期的工作,或者如果两个“活动”工作的开始日期相同,则只需随机选择其中一个,跳过另一个活动,然后继续他们最近的以前的工作。 “活动”作业的 EndDate 值始终为 NULL。
所以我正在寻找的结果集如下:
ID NAME Company StartDate EndDate Status rn
----------------------------------------------------------------------------------------------
50 Bob LMN 07-05-2019 NULL Active 1
50 Bob ABC 11-15-2016 02-05-2017 Former 2
50 Bob XYZ 05-06-2014 05-06-2015 Former 3
我已经尝试了下面的代码,但它无法检查两个活动作业状态并正确地给它们一个行号。根据上述条件,我希望只有一个 Active 工作是 rn = 1,而 rn = 2 和 rn = 3 将是最后 2 个“前”工作:
select *, row_number() over (partition by ID, NAME order by CASE WHEN Status = 'Active' AND
EndDate is NULL THEN Status END desc, EndDate desc
) rn
from employment
【问题讨论】:
-
他们能有更多那两个在职的工作吗?如果是这样,大概仍然只有一个出现在结果中?
标签: sql-server sql-order-by case greatest-n-per-group window-functions