簡體   English   中英

SQL排名生效日期

[英]SQL ranking effective dates

可能有一種非常簡單的方法來執行此操作,但我想不起來-我有一個數據集,該數據集返回的是最低職位和最低有效日期,然后所有effdts>> min_effdt。 為了在制圖程序中使用此數據,我想對每個連續的effdt(如果存在)進行排名,例如在“最小角色”,“第二,第三,最大”中。 當然,每人可能有2至20個工作崗位。

起初,我考慮過嘗試一個case語句,但是當一次分析兩列時,我認為這種方法不起作用。 是否有一條允許排名的SQL語句? 現在我的數據看起來像

員工編號 最低基本角色| 最低角色| 基本角色| 角色扮演

並且來自兩個表,第二個表被引入兩次以使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

您要查找的函數是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()也可能有用。 它們在處理重復值的方式上有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM