Sql 密集秩重复值oracle

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

因此,我非常高兴能够根据生效日期对结果进行排名,但目前我遇到了一个问题,即一个数据元素重复(POD),而另一个数据元素根据EFFDT(DEPT)进行更改

我只想对Pod的唯一值进行排名,后面是Dept。然而,Pod是基于Dept的,Dept的变化更频繁。下面的代码给了我:

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