因此,對於我的一個應用程序,我決定需要捕獲比我目前所做的更詳細的指標。我的團隊創建文檔,具體而言,我想知道該文檔在其開發的每個階段花了多長時間(以天爲單位)。這些數據將通過輸入表格捕獲,當我們的團隊成員將文檔移動到不同的階段時,這些輸入表格將填寫。捕捉該數據表的結構,像這樣: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);
難道你不知道,你在你做更新時間更新'doc_entry_id'? – Ben
正在更新的DOC_ENTRY_ID是剛剛提交的DOC_ENTRY_ID(因此,此過程只能在插入輸入表單時添加新行)運行。因此,在上面的第二個示例中,您可以看到,當提交DOC_ENTRY_ID'2'時,DOC_ENTRY_ID'1'的DOC_PHASE_DURATION是更新內容。實際上,該表格將用於所有文檔,因此DOC_ENTRY_IDs可能不會完全順序。我只需要獲取該DOC_ID的前一個最新條目並更新它。 – Spags
是的,你的代碼可以做到這一點,但是你的示例數據意味着你需要更新的'doc_entry_id'是當前的-1。這取決於你是否按順序使用複合鍵(doc_entry_id,doc_id)執行唯一性或代理鍵/。 – Ben