可能有一种非常简单的方法可以做到这一点,但我无法想到它 - 我有一个数据集,它返回最小职位和最短生效日期,然后所有的影响>比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
答案 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()
也可能有用。它们处理重复值的方式不同。