SQL排名生效日期

时间:2013-09-16 14:42:32

标签: sql oracle

可能有一种非常简单的方法可以做到这一点,但我无法想到它 - 我有一个数据集,它返回最小职位和最短生效日期,然后所有的影响>比min_effdt。为了在图表程序中使用这些数据,我想对每个连续的effdt进行排名(如果它存在),如Min Role Effdt,然后是2nd,3rd,Max。当然,每人可能有2到20个工作岗位。

起初我考虑尝试一个案例陈述,但我不认为一次分析两个列时这是有效的。是否有允许排名的SQL语句?现在我的数据看起来像

员工编号|最小基础角色|最小角色Effdt |基本角色|角色Effdt

来自两个表,第二个表引入两次以将Role / Effdt作为Min,然后All大于Min。

我正在使用ORACLE。代码如下:

 SELECT DISTINCT AL4.FULL_NAME,
 AL4.EMPLOYEE_NUMBER,
            AL4.HIRE_DATE,
            AL4.DATE_OF_BIRTH,
            AL4.AGE,
            AL4.TERM_DATE,
            AL4.ETHNIC_ORIGIN,
            AL2.RECORDVALUE AS MIN_BASE_ROLE,
            AL3.RECORDVALUE AS BASE_ROLE,
            AL3.EFFECTIVE_START_DATE AS "ROLE EFFECTIVE DATE",
            AL2.EFFECTIVE_START_DATE AS "MIN ROLE EFFDT"

  FROM T1 AL2,
   T2  AL3,
   T3  AL4

WHERE AL4.PERSON_ID = AL2.PERSON_ID
AND AL4.PERSON_ID = AL3.PERSON_ID
AND AL4.EMPLOYEE_NUMBER = AL2.HISL_ID
AND AL4.EMPLOYEE_NUMBER = AL3.HISL_ID
AND AL2.RECORDTYPE = 'BASE_ROLE'
AND AL3.RECORDTYPE = 'BASE_ROLE'

AND AL2.EFFECTIVE_START_DATE = (SELECT MIN(A.EFFECTIVE_START_DATE) from T1 A where A.person_id =   al2.person_id and a.recordtype = al2.recordtype)
AND AL3.EFFECTIVE_START_DATE > AL2.EFFECTIVE_START_DATE 
AND (AL4.TERM_DATE >= '01-JAN-2012' or AL4.TERM_DATE is NULL)
order by AL4.EMPLOYEE_NUMBER

1 个答案:

答案 0 :(得分:1)

您正在寻找的功能是row_number()。我想你想要的表达是:

row_number() over (partition by AL4.EMPLOYEE_NUMBER
                   order by AL2.EFFECTIVE_START_DATE
                  ) as ranking

函数row_number()表示“为一组行分配序号”。 partition by子句定义了组,其中编号在1处重新开始。 order by子句指定组内的排序。

类似的函数rank()dense_rank()也可能有用。它们处理重复值的方式不同。