2015-12-23 35 views
0

我有一張表格,用於跟蹤位置中的物品。由於該表由兩個單獨的系統供給,日期可以重疊。讓我們稱他們爲System1和System2。回顧一個以上的記錄滯後

我使用分區來檢查日期重疊時,但遇到錯誤記錄不是相鄰行時遇到障礙。即來自System2的第一條記錄存在於來自System1的記錄中,因此被丟棄,但System2中的第二條記錄要麼在System2中的最後一條記錄結束之前開始,要麼同樣在最後一條記錄中。

爲了解決這個問題,我試圖捕獲System1中的最後一個結束日期,因此我可以輕鬆地根據此值檢查我的日期。我的問題是我不太瞭解分區來做到這一點。我基本上需要對分區進行分區。主分區基於PartID,第二個分區基於SysID,或者甚至可以使用我猜測的Source。爲了使事情變得整潔,我將下面的示例數據中的唯一記錄ID更名爲一個數字ID。

當前代碼僅僅是一系列由ADTM

的樣本數據下令LEAD/LAG報表分區在PARTID的: 對於這個數據,我目前正在與正確識別單記錄*爲錯誤。帶**的那個是一個不明的錯誤,因爲它被來自System1的記錄3757871包含。我需要能夠將ID 6的日期與ID 4的日期進行比較,以便我可以識別該錯誤。

Source  SysID  PartID ID  ADTM    SDTM 
System1  A8871247 1661181 1 2014-08-15 11:21 2014-08-15 11:35 
*System2 1661181  1661181 2 2014-08-15 11:27 2014-08-19 11:04* 
System1  A8871247 1661181 3 2014-08-15 11:35 2014-08-16 22:43 
System1  A8871247 1661181 4 2014-08-16 22:43 2014-08-20 15:44 
*System2 1661181  1661181 5 2014-08-19 11:04 2014-08-19 11:05* 
**System2 1661181  1661181 6 2014-08-19 11:05 2014-08-20 15:30** 
System2  1661181  1661181 7 2014-08-20 15:30 2014-08-20 15:44 
System2  1661181  1661181 8 2014-08-20 15:44 2014-08-22 11:34 

我的最終結果是ID 2,5,6和7將被丟棄,並且ID 8將具有它的ADTM更新爲ID 4的SDTM創建系統之間的無縫過渡。

基本上我需要的是MAX(SDTM) OVER(PARTITION BY PartID ORDER BY ADTM WHERE Source = 'System1')

+0

我想確保我理解完整的目標,爲什麼ID 7不是錯誤?這是時間在ID 4的時代。 –

+0

哎呀,你是對的。這也是一個錯誤。 – Matt

+0

好的,謝謝,我還有一個問題:如果你有部分重疊(假設ID 9具有ADTM = 2014-08-22 11:30和SDTM = 2014-08-23 11:50),那麼這會被認爲是錯誤或您將SDTM更新爲先前非錯誤的最大ADTM(根據示例,2014-08-22 11:34)。 –

回答

0

編輯:我絕對不知道到底是什麼你正在嘗試做的,而是根據你的實際問題,你可以得到最大SDTM在使用像以前所有的行這樣的:

with t2 as (
    select *, max(SDTM) over (partition by PartID order by ADTM, ID) maxSDTM 
    from table_name 
) 
select *, lag(maxSDTM, 1) over (partition by PartID order by ADTM, ID) 
from t2 

通過使用與MAX過子句,使它成爲一個窗口功能,讓以前所有的行,包括當前行的最高SDTM。然後,您需要基本排除當前行,以便您可以使用LAG獲取以前的最大值。希望這有助於,對不起,我不明白你的最終目標。老:我可能不會理解這個問題,但如果是這樣,我的本能會改爲使用自連接。以下查詢應識別所有錯誤:

SELECT * 
FROM table_name t 
JOIN table_name prev 
ON (t.ADTM > prev.ADTM OR (t.ADTM = prev.ADTM AND t.ID > prev.ID)) 
    AND t.SDTM <= prev.SDTM 
    AND t.PartID = prev.PartID 
+0

這似乎並不奏效。我真正想要的是通過PartID – Matt

+0

捕獲分區中system1的最大sdtm的方法您想要每個零件ID的最大SDTM?這將是一個按作業分組的小組。或者,您是否希望每行的最大SDTM按零件ID進行分區,並在當前行之前進行分區? –