2012-05-28 69 views
1

我有一個emp_id,firstname,lastname,region_id,status和effective_date等列的僱員表。如何獲取oracle中的最新員工記錄?

員工表可以爲具有不同生效日期和狀態的同一員工創建多個條目。

員工可以有兩個狀態'Leaver'和'Joiner'。

id  emp_id firstname  region status  effective_date 
1  1   James  Asia  Joiner  1-Jan-2012 
2  1   James  UK  Leaver  1-Aug-2012 
3  1   James  USA  Joiner  1-Aug-2012 
4  1   James  Asia  Leaver  1-May-2012 
5  1   James  UK  Joiner  1-May-2012 
6  1   James  USA  Leaver  1-Sep-2012 

隨着員工表上面的數據,如果我想要得到詹姆斯的最新紀錄爲2012年1月1日,我會得到與ID記錄= 1,

如果我想要得到的如2012年5月1日詹姆斯的最新紀錄,我會得到與ID記錄= 5

如果我想要得到詹姆斯的最新紀錄爲2012年8月1日,我會得到使用id = 3的記錄,

如果我想得到最新的詹姆斯記錄,因爲在2012年9月1日,我會得到id = 6的記錄

以下查詢正確地給我最新的記錄

SELECT 
     emp_id, 
     MAX(effective_date) AS latest_effective_date 
FROM 
     EMPLOYEE 
GROUP BY 
     emp_id 

但後來我怎麼得到其他列,比如姓名,區域等

如果我把它們放在SELECT子句或group by子句,我不只是得到最新的記錄,但其他記錄也是如此。

+0

你能解釋一下嗎? 「如果我想得到2012年8月1日詹姆斯的最新紀錄,我會得到id = 3的記錄」爲什麼不是2? – Sebas

+0

@ Sebas。當然,詹姆斯將於2012年8月1日從英國地區遷往美國。因此,如果我需要了解詹姆斯在2012年8月1日的情況,那麼它必須返回美國而不是英國。因此,記錄id = 3,而不是id = 2。 – ashishjmeshram

+1

那麼你的整個邏輯將被審查,你自己的查詢返回「正確的最後一個記錄」只是偶然。我現在脫離了這個話題,你需要解決一些分析問題。 – Sebas

回答

0

嘗試:

SELECT * 
FROM EMPLOYEE emp 
INNER JOIN (SELECT max(id) AS id 
     emp_id, 
     MAX(effective_date) AS latest_effective_date 
FROM 
     EMPLOYEE 
GROUP BY 
     emp_id) AS employee_1 on emp.id = employee_1.id 
+0

可能無法依次生成ID。在插入2012年8月1日的記錄(即預測)之前,用戶可以在系統中輸入1-sep-2012的記錄。 – ashishjmeshram

2

你需要內部連接你已經回到你的員工表的查詢來限制記錄:

SELECT Emp.* 
FROM Employee Emp 
     INNER JOIN 
     ( SELECT Emp_ID, MAX(effective_date) AS latest_effective_date 
      FROM Employee 
      GROUP BY Emp_ID 
     ) MaxEmp 
      ON Emp.Emp_ID = MaxEmp.Emp_ID 
      AND Emp.Effective_Date = MaxEmp.latest_effective_date 
+0

沒有,沒有工作。 – ashishjmeshram

+2

我不能根據此反饋建議改進/更正。爲什麼它不工作,它不運行?它是否運行,但與您期望的結果不符? – GarethD

1

您所輸入的查詢不一定因爲在這種情況下返回記錄與ID 3,5,5,因爲在這種情況下:

2  1   James  Asia  Leaver  1-May-2012 
3  1   James  UK  Joiner  1-May-2012 

effective_date對於兩行都是相同的,並且它可能會返回記錄,其ID爲2而不是3.

嘗試向表中添加時間或將時間添加到effective_date列,這樣您就可以從a中獲取最新結果用戶在確定的日期。

9
SELECT * FROM 
(SELECT 
    e.*, 
    ROW_NUMBER() OVER (partition by emp_id order by effective_date DESC) r 
FROM 
    EMPLOYEE e) 
WHERE r = 1; 

以上將爲您獲得最大有效日期的記錄,每個不同的emp_id。

您的特定日期返回記錄的第二個要求應該由該查詢中fullfiled:

(「狀態ASC」 - 如果有也是「利弗」同一日期將採取的以「木」的狀態護理。)

SELECT * FROM 
(SELECT 
    e.*, 
    ROW_NUMBER() OVER (partition by emp_id order by effective_date DESC, status ASC) r 
FROM 
    EMPLOYEE e 
WHERE effective_date <= '<your desired date>') 
WHERE r=1; 
1

試試這個

SELECT 
    MAX(id) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) id, 
    MAX(emp_id) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) emp_id, 
    MAX(firstname) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) firstname, 
    MAX(status) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) status, 
    MAX(effective_date) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) effective_date 
FROM Employee GROUP BY firstname