2015-11-04 48 views
0

問題我有一個包含以下各列的表格:與滯後功能(DB2)

userid Designation load_dt  audit_time type 
A  Engg  3/11/2015 22/06/2015 R   
A  Engg  4/11/2015 03/07/2015 D    
A  Engg  31/12/9999 4/10/2015 R  
A  doc   31/12/9999 22/06/2015 R  

我試圖通過跟蹤用戶標識和名稱的基礎上audit_time的變化來創建輸出。對於第一行,開始日期將是01-01-1900,如果沒有其他記錄存在,則結束日期將是12-31-9999。對於userid = A,由於更改發生在2015年7月3日,因此第一條記錄的起始日期從01/01/1900開始,並於2015年7月3日結束。第二條記錄的起始日期爲2015年7月3日,並且保持有效,直到2015年10月4日。第三次更改從2015年10月4日開始,並有未來結束日期。

userid Designation load_dt  audit_time type start_date end_date 

A  Engg  3/11/2015 22/06/2015 R  01/01/1900 03/07/2015  
A  Engg  4/11/2015 03/07/2015 D **03/07/2015 4/10/2015    
A  Engg  31/12/9999 4/10/2015 R **4/10/2015 31/12/9999 
A  doc   31/12/9999 22/06/2015 R 01/01/1900 31/12/9999 

我用下面的查詢:

select userid, designation, LOAD_DT, AUDIT_TIME, TYPE 
, coalesce(lag(AUDIT_TIME) over (partition by userid, designation order by AUDIT_TIME),'1900-01-01') start 
, coalesce(lead(AUDIT_TIME) over (partition by userid, designation order by AUDIT_TIME),'9999-12-31') enddt 
from DUMMY1; 

我得到以下結果:

userid Designation load_dt  audit_time type start_date end_date 
A  Engg  3/11/2015 22/06/2015 R 01/01/1900 03/07/2015 
A  Engg  4/11/2015 03/07/2015 D **22/06/2015 4/10/2015   
A  Engg  31/12/9999 4/10/2015 R **03/07/2015 31/12/9999 
A  doc   31/12/9999 22/06/2015 R 01/01/1900 31/12/9999  

我希望我能夠正確地解釋我的問題。

+0

任何幫助傢伙... –

+0

很顯然,你從別的粘貼這一點,因爲你的語句有語法錯誤(你沒有定義別名's',並且對審計列使用兩個不同的名稱)。否則......你確定這些是你想要的結果嗎?通常情況下,第一行代表插入,因此無論在哪一點之前都不存在 - 通常您要麼使用「當前」值,要麼添加一行(在「我們有信息之前」) –

+0

我意外地忘記刪除「s」,我的擔心更多地與數據相關,而不是語法錯誤。我的壞名字被抄襲了。 –

回答

0

我能夠通過只需要調整滯後的計算要解決的問題:

select userid, designation, LOAD_DT, AUDIT_TIME, TYPE 
, case when lag(AUDIT_TIME) over (partition by userid, designation order by AUDIT_TIME) then '1900-01-01' else audit_time end start 
, coalesce(lead(AUDIT_TIME) over (partition by userid, designation order by AUDIT_TIME),'9999-12-31') enddt 
from DUMMY1; 
+0

這個工程,但爲了骯髒的原因。噢,有一種方法可以提供一個「默認」值:'LEAD(audit_time,1,DATE('9999-12-31'))'('1'是偏移量)。 –

+0

感謝Clockwork-Muse,我沒有;不知道我們可以給出一個默認值以及滯後。我很困惑如何將以前記錄的結束日期作爲下一行的開始日期。但是我第二天早上就能弄明白了:)。這就是爲什麼粘貼結果。 非常感謝您抽出時間和回覆我的問題。 :) –