密集等级重复值oracle

时间:2013-09-18 17:47:10

标签: sql oracle distinct rank

所以我很高兴能够根据有效日期对结果进行排名,但目前我遇到的问题是一个数据元素重复(POD)而另一个数据元素基于EFFDT(DEPT)发生变化。

我只想为Pod和后来的部门排序唯一值。但是Pod基于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;

是否存在仅对唯一值进行排名的功能?

2 个答案:

答案 0 :(得分:1)

您正在寻找的功能是分析函数dense_rank()

dense_rank() over (partition by eenbr order by pod) as ranking

这是获得所需内容的最简单方法。您只需将其添加到查询的select子句中即可。

答案 1 :(得分:0)

没有此功能,但您可以在使用嵌套窗口函数时获得结果:

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;

编辑: 好吧,我注意到这是一个过于复杂的简单DENSE_RANK版本,不同顺序,在Gordon发布他的回答之前不久:-)

dense_rank() over (partition by AL4.EMPLOYEE_NUMBER order by AL7.POD_NBR)