0

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

起初我考虑尝试使用 case 语句,但我认为这在同时分析两列时不起作用。是否有允许排名的 SQL 语句?现在我的数据看起来像

员工编号 | 最低基本角色 | 最小角色效应 | 基本角色 | 角色效应

并且来自两张桌子,第二张桌子被带入两次以获得角色/ Effdt为Min,然后All大于Min。

我正在使用甲骨文。代码如下:

 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
4

1 回答 1

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()也可能有用。它们在处理重复值的方式上有所不同。

于 2013-09-16T14:49:57.910 回答