因此,对于我的一个应用程序,我已经决定我需要能够捕获比我目前更详细的指标。我的小组创建文档,特别是我想知道该文档在其开发的每个阶段花费了多长时间(以天为单位)。这些数据将通过输入表单捕获,该表单将由我的团队成员在将文档移动到不同阶段时填写。捕获此数据的表格结构如下:
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 :(得分: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