按标准分组并显示记录SQL

时间:2014-06-19 02:13:58

标签: sql sql-server grouping

我有下表:

     | 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:

  1. 我查询了整个表(带有select)到由PID排序的数据表,然后是DateHired(asc)
  2. 为数据表中的每条记录循环
  3. 并将检测到的最后一条记录复制到该PID的循环中,只要状态!="终止"
  4. 编辑更正了给定的样本表

    编辑包括我尝试过的解决方案。

1 个答案:

答案 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值最大的行的值为1where子句选择值1的位置,这是每个datehired的最大pid