2013-09-16 46 views
0

可能有一個非常簡單的方法來做到這一點,但我不能完全想到它 - 我有一個數據集返回最低職稱和最低生效日期,然後所有effdts> than min_effdt。爲了在製圖程序中使用這些數據,我想對每一個連續的effdt進行排名,如Min Role Effdt,然後是2nd,3rd,Max。當然,每人可以有2到20個工作崗位。SQL排名生效日期

起初我考慮過嘗試一個case語句,但我認爲這不會一次分析兩列。有沒有可以排名的SQL語句?現在我的數據看起來像

員工數|最小基地角色|最小角色Effdt |基地角色|角色Effdt

來自兩個表,第二個錶帶來兩次以獲得角色/ Effdt爲最小,然後所有大於最小。

我正在使用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

您能否提供一些示例數據集?例如'With Table1 as(選擇'a'作爲col1從雙UNION ALL選擇'b'作爲col1從雙)select * from table1' – SriniV

回答

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()也可能有用。他們在處理重複值的方式上有所不同。

+0

哦,你是一個非常棒的人。就是這樣。 – caroline