Sql 密集秩重复值oracle
因此,我非常高兴能够根据生效日期对结果进行排名,但目前我遇到了一个问题,即一个数据元素重复(POD),而另一个数据元素根据EFFDT(DEPT)进行更改 我只想对Pod的唯一值进行排名,后面是Dept。然而,Pod是基于Dept的,Dept的变化更频繁。下面的代码给了我:Sql 密集秩重复值oracle,sql,oracle,distinct,rank,Sql,Oracle,Distinct,Rank,因此,我非常高兴能够根据生效日期对结果进行排名,但目前我遇到了一个问题,即一个数据元素重复(POD),而另一个数据元素根据EFFDT(DEPT)进行更改 我只想对Pod的唯一值进行排名,后面是Dept。然而,Pod是基于Dept的,Dept的变化更频繁。下面的代码给了我: EENBR PodRank POD DeptRank DeptNbr DeptEffdt 100 1 73 1 12420 4/11/2005 100 2 7
EENBR PodRank POD DeptRank DeptNbr DeptEffdt
100 1 73 1 12420 4/11/2005
100 2 73 2 12560 5/22/2005
100 3 73 3 12501 6/24/2007
200 1 12 1 50768 3/14/2005
200 2 13 2 10949 9/9/2012
300 1 73 1 12450 3/21/2005
300 2 73 2 12471 12/25/2005
300 3 73 3 12581 12/21/2008
300 4 73 4 12585 6/6/2010
300 5 73 5 12432 5/19/2013
SELECT DISTINCT
AL4.FULL_NAME,
AL4.EMPLOYEE_NUMBER,
dense_rank() over (partition by AL4.EMPLOYEE_NUMBER
order by AL3.EFFECTIVE_START_DATE) as POD_RANKING,
AL7.POD_NBR as POD,
row_number() over (partition by AL4.EMPLOYEE_NUMBER
order by AL3.EFFECTIVE_START_DATE) as DEPT_RANKING,
AL3.RECORDVALUE AS DEPT_NUMBER,
AL3.EFFECTIVE_START_DATE AS "DEPT EFFECTIVE DATE"
FROM T1 AL3,
T2 AL4,
T3 AL7
WHERE AL4.PERSON_ID = AL3.PERSON_ID
AND AL4.EMPLOYEE_NUMBER = AL3.EMPLOYEE_NUMBER
AND AL3.RECORDTYPE = 'DEPARTMENT_NUMBER'
AND AL7.DEPT_NBR = AL3.RECORDVALUE
Order By AL4.Employee_Number;
是否有只对唯一值进行排序的函数 没有用于此的函数,但使用嵌套窗口函数时可以得到结果:
SELECT dt.*,
SUM(flag) OVER (PARTITION BY EMPLOYEE_NUMBER
ORDER BY "DEPT EFFECTIVE DATE") AS POD_RANKING
FROM
(
SELECT
AL4.FULL_NAME,
AL4.EMPLOYEE_NUMBER,
AL7.POD_NBR AS POD,
ROW_NUMBER() OVER (PARTITION BY AL4.EMPLOYEE_NUMBER
ORDER BY AL3.EFFECTIVE_START_DATE) AS DEPT_RANKING,
AL3.RECORDVALUE AS DEPT_NUMBER,
AL3.EFFECTIVE_START_DATE AS "DEPT EFFECTIVE DATE",
CASE WHEN ROW_NUMBER()
OVER (PARTITION BY AL4.EMPLOYEE_NUMBER,AL7.POD_NBR
ORDER BY AL3.EFFECTIVE_START_DATE) = 1 THEN 1 ELSE 0 END AS flag
FROM T1 AL3,
T2 AL4,
T3 AL7
WHERE AL4.PERSON_ID = AL3.PERSON_ID
AND AL4.EMPLOYEE_NUMBER = AL3.EMPLOYEE_NUMBER
AND AL3.RECORDTYPE = 'DEPARTMENT_NUMBER'
AND AL7.DEPT_NBR = AL3.RECORDVALUE
) dt
ORDER BY AL4.Employee_Number;
编辑:
好的,我注意到这是一个简单的、顺序不同的稠密等级的过于复杂的版本,就在戈登发布他的答案之前不久:-)
您要查找的函数是分析函数
densite\u rank()
:
这是得到你想要的东西的最简单的方法。您可以将它添加到查询的
select
子句中。我不明白。你的预期结果是什么?为什么?预期结果会让第一个家伙排名1,1,1,因为他的吊舱是一样的。第二个将有1,2,这是正确的。所以,emp 100保持在同一个吊舱中,等级1,1,1。emp 200有2个吊舱,等级1,2。emp 300,相同的pod,等级1,1,1,1,1ok,如果数据像13,13,73,73,13:这应该是1,1,2,1还是1,1,2,2,3?好吧,我确实希望它基于Dept Effdt顺序,但是如果pod是唯一的,只需要一个新的计数。哦,这太棒了。我不断地重读,努力使所做的事情符合我的豌豆脑。
dense_rank() over (partition by AL4.EMPLOYEE_NUMBER order by AL7.POD_NBR)
dense_rank() over (partition by eenbr order by pod) as ranking