0

我在源表中有一个数据,如下所述:

Employee_Id Status  Date        Address Phone number
52345       N       28-Jan-10   ABC     9833455456
52345       N       30-Apr-10   ABC     9833455456
52345       Y       13-Dec-10   ABC     9934467879
10145       N       25-Mar-10   PQR     8766129989
32456       N       20-Jun-10   XYZ     9860799849
32456       N       03-Nov-10   XYZ     9860799849
32456       Y       07-Feb-11   XYZ     9860799849
32456       Y       22-May-11   XYZ     8977767889
32456       N       18-Sep-11   DEF     9811223300
42123       N       25-Feb-10   MNO     9920030048
42123       N       23-Sep-11   MNO     9833445566

目标是在输出中获取员工的唯一记录,但基于以下提到的标准:

  1. 如果员工 ID 是唯一的,则按原样传递。
  2. 如果员工 ID 重复,则传递 status=”Y” 的记录</li>
  3. 如果即使在应用 status=”Y” 后员工 ID 仍然重复,则选择具有最新日期的记录。

有了这些规则,我应该得到这些结果:

Employee_Id Status  Date        Address Phone number
52345       Y       13-Dec-10   ABC     9934467879
10145       N       25-Mar-10   PQR     8766129989
32456       Y       22-May-11   XYZ     8977767889
42123       N       23-Sep-11   MNO     9833445566
4

1 回答 1

0

您可以使用 row_number() 函数来获得您想要的。

select t.*
from (select t.employee_id,
             row_number() over (partition by employee_id order by status desc, date desc) as seqnum,
             count(*) over (partition by employee_id) as cnt
      from t
     ) t
where seqnum = 1 and not (cnt > 1 and status = 'N')

这将按状态(首先是“Y”)然后按日期(最晚在前)对每个员工的行进行排序。然后它选择该组中的第一个。

如果你只有一行,那么它将有 seqnum = 1。

如果你只有一个“Y”,那么它的 seqnum = 1。

如果您有多个“Y”,那么这将选择日期最晚的那个。

于 2012-07-18T14:27:28.487 回答