2012-06-15 22 views
0

因此,對於我的一個應用程序,我決定需要捕獲比我目前所做的更詳細的指標。我的團隊創建文檔,具體而言,我想知道該文檔在其開發的每個階段花了多長時間(以天爲單位)。這些數據將通過輸入表格捕獲,當我們的團隊成員將文檔移動到不同的階段時,這些輸入表格將填寫。捕捉該數據表的結構,像這樣:Oracle APEX - SQL - 創建順序歷史和計算每個階段之間的天

TBL_DOC_TIMELINE 
DOC_ENTRY_ID  DOC_ID  DOC_STATUS  DOC_DATE  DOC_PHASE_DURATION 
1    123  Planned  06-05-2012  

我需要什麼,當創建新條目的前一個條目的DOC_PHASE_DURATION將與之間的天數來填充弄清楚如何做的是DOC_DATE關於該文件的以前的條目和新的條目。它應該是這樣的:

DOC_ENTRY_ID  DOC_ID  DOC_STATUS  DOC_DATE  DOC_PHASE_DURATION 
1    123  Planned  06-05-2012  10  
7    123  Draft   06-15-2012   

我們所有的文件將使用相同的表此功能,所以我不能簡單地在DOC_ENTRY_ID鍵,雖然它可以幫助。我需要找到DOC_ID的最大DOC_ENTRY_ID然後計算。我需要這樣做直到達到'已發佈'的狀態,並且應該在單元格中插入'0'點,因爲這是DOC_ID生命週期的末尾。像這樣:

DOC_ENTRY_ID  DOC_ID  DOC_STATUS  DOC_DATE  DOC_PHASE_DURATION 
1    123  Planned  06-05-2012  10  
7    123  Draft   06-15-2012  5 
38    123  Approval  06-20-2012  10 
102    123  Published  06-30-2012  0 

我會想象這將在SQL頁面過程中,甚至觸發器。下面是我已經拉到一起的僞代碼,但我相信它的缺陷。還沒有機會對它進行測試,但如果我在正確的軌道上,我想獲得您的意見。一旦我有機會運行它,我將編輯它。謝謝。

UPDATE TBL_DOC_TIMELINE 
SET DOC_PHASE_DURATION = 
    (SELECT trunc((trunc(DOC_DATE)- &P1_DOC_DATE.)) 
    FROM TBL_DOC_TIMELINE WHERE &P1_DOC_ID. = DOC_ID) 
WHERE DOC_ENTRY_ID = 
    (SELECT MAX(DOC_ENTRY_ID) FROM TBL_DOC_TIMELINE WHERE &P1_DOC_ID. = DOC_ID); 
+0

難道你不知道,你在你做更新時間更新'doc_entry_id'? – Ben

+0

正在更新的DOC_ENTRY_ID是剛剛提交的DOC_ENTRY_ID(因此,此過程只能在插入輸入表單時添加新行)運行。因此,在上面的第二個示例中,您可以看到,當提交DOC_ENTRY_ID'2'時,DOC_ENTRY_ID'1'的DOC_PHASE_DURATION是更新內容。實際上,該表格將用於所有文檔,因此DOC_ENTRY_IDs可能不會完全順序。我只需要獲取該DOC_ID的前一個最新條目並更新它。 – Spags

+0

是的,你的代碼可以做到這一點,但是你的示例數據意味着你需要更新的'doc_entry_id'是當前的-1。這取決於你是否按順序使用複合鍵(doc_entry_id,doc_id)執行唯一性或代理鍵/。 – Ben

回答

1

我會認爲你已經獲取你需要的所有指標,因爲持續時間可以衍生從現有的數據。你可以創建一個視圖:

create or replace view vw_doc_timeline as 
    select t.doc_entry_id, t.doc_id, t.doc_status, t.doc_date 
     , case when doc_status = 'Published' then 0 
       else lead(doc_date) over (partition by doc_id order by doc_entry_id) 
        - doc_date 
       end as duration 
    from tbl_doc_timeline t; 

然後:

SQL> select * from vw_doc_timeline; 

DOC_ENTRY_ID  DOC_ID DOC_STATUS      DOC_DATE DURATION 
------------ ---------- ------------------------------ --------- ---------- 
      1  123 Planned      05-JUN-12   10 
      7  123 Draft       15-JUN-12   5 
      38  123 Approval      20-JUN-12   10 
     102  123 Published      30-JUN-12   0 
+0

託尼,感謝您的幫助!它確實很棒!我想知道你是否也可以幫助我弄清楚如何調整這一點,以便文檔歷史的最後階段(可以說文檔還在處理中,還沒有發佈)可以根據sysdate()計算出來,這樣在視圖中就不會有空值。所以在上面的例子中,DOC_ENTRY_ID'7'的計算日期是根據sysdate()計算的,直到輸入DOC_ID的下一個條目DOC_ENTRY_ID'38',然後DOC_ENTRY_ID'38'將根據sysdate計算。思考?提前致謝! – Spags