2012-01-17 41 views
0

僅返回FTE或位置標題字段存在差異的記錄。僅返回現場數據存在差異的記錄

我有一個員工數據表,其中包含員工號,工作號,開始日期FTE和職位。公司爲每位員工和工作,我只想要返回記錄,其中有在FTE或職位

Record,Employee#,Job#,Start Date, FTE,Position 
1,  1000, 01, 01/01/2011, 100, A 
2,  1000, 01, 01/06/2011, 100, A 
3,  1000, 01, 01/07/2011, 80,  B 
4,  1000, 01, 01/08/2011, 80,  C 
5,  1000, 01, 01/10/2011, 80,  C 
6,  1000, 02, 01/01/2011, 20,  A 
7,  1000, 02, 01/05/2011, 20,  A 
8,  1000, 02, 01/08/2011, 20,  B 

查詢應返回記錄1,3,4,6,8的變化。 (這些是FTE和位置與上一行不同的唯一記錄)

+0

記錄1沒有previus記錄,所以應該包含第一條記錄? – pistipanko 2012-01-17 20:49:41

回答

0

取決於你所使用的數據庫。如果你使用的甲骨文以下應該做的伎倆:

SELECT * 
FROM (
    SELECT 
    record 
    , employee# 
    , job# 
    , start_date 
    , fte 
    , LAG(fte) OVER (ORDER BY record) previous_row_fte 
    , position 
    , LAG(position) OVER (ORDER BY record) previous_row_position 
    FROM scott.stack_overflow_employee 
) 
WHERE fte != previous_row_fte 
OR position != previous_row_position 
OR previous_row_fte IS NULL 
OR previous_row_position IS NULL 

在子查詢,你可以看到使用了Oracle的解析函數LAG的 - 在這一篇好文章可以發現here。這個函數按'記錄'排序行,然後選擇前一行fte或位置。在外部查詢中,如果當前的fte不等於前一行fte或與位置相同,則WHERE子句將指定僅返回行的條件。另外,由於oracle處理NULL值的方式,如果任一值爲NULL,WHERE子句中的附加條件也會返回該行。

雖然我提供了一個解決方案,但我必須質疑爲什麼要這麼做,如果提供了更多信息,那麼可能有更好的方法來滿足您的解決方案,並返回每個有變化的行到更大的事情。如果你能提供更多關於你在做什麼的信息,那麼也許可以達到更好的解決方案。

0

這看起來像一個典型的自連接場景:您需要再次查詢您的表並查看是否存在具有不同FTE的早期記錄或位置。

像這樣的東西(不,我沒有嘗試這個):

select later.* 
from 
    my_table as later, 
    my_table as earlier -- same table again 
where 
    later.employee = earlier.employee -- the self-join 
    and 
    later.date > earlier.date -- lest we see changes twice 
    and 
    later.FTE != earlier.FTE -- the change 
;