我有下表:
| PID | FullName | Position | Salary | Status | DateHired
| 11 | Dave | Clerk | 100 | Extended | 2014-01-30
| 11 | Dave | Clerk | 100 | Hired | 2014-01-02
| 22 | Chris | Guard | 80 | Extended | 2014-01-30
| 22 | Chris | DJ | 100 | Hired | 2014-01-02
| 33 | Dud | Clerk | 200 | Terminated| 2014-01-30
| 33 | Dud | Clerk | 200 | Hired | 2014-01-03
| 44 | Trish | Clerk | 200 | Hired | 2014-01-25
我需要能够输出按PID分组的每条记录及其最新状态。如果他们的最新状态被终止,则应该忽略它。 输出应该是这样的:
| PID | FullName | Position | Salary | Status | DateHired
| 11 | Dave | Clerk | 100 | Extended | 2014-01-30
| 22 | Chris | Guard | 80 | Extended | 2014-01-30
| 44 | Trish | Clerk | 200 | Hired | 2014-01-25
Dud已被终止,因此他没有出现在桌面上。
对此有疑问吗?或者我应该将表链接到.net,并从那里循环?
我所做的也是ff:
编辑更正了给定的样本表
编辑包括我尝试过的解决方案。
答案 0 :(得分:1)
Dud已被终止,但雇用日期是之后。因此,您提供的数据和逻辑不一致。要获取最新状态并删除已终止的状态,请使用row_number()
:
select t.*
from (select t.*, row_number() over (partition by pid order by datehired desc) as seqnum
from table t
) t
where seqnum = 1 and status <> 'Terminated';
row_number()
将以1
开头的顺序值分配给一组行。行集由partition by
子句定义,因此在此示例中,具有相同pid
的所有行都在同一集合中。然后,枚举基于order by
子句,因此在这种情况下,集合中datehired
值最大的行的值为1
。 where
子句选择值1
的位置,这是每个datehired
的最大pid
。