0

この質問は、この質問の続きです: ( Oracle APEX - SQL - シーケンシャル履歴の作成と各フェーズ間の日数の計算)

背景:

そのため、私のアプリケーションの 1 つで、以前よりも詳細なメトリックを取得する機能が必要であると判断しました。私のグループはドキュメントを作成しています。具体的には、そのドキュメントが開発の各フェーズに費やした正確な時間 (日数) を知りたいと考えていました。このデータをキャプチャするためのテーブルは、次のように構成されています。

 TBL_DOC_TIMELINE
 DOC_ENTRY_ID     DOC_ID     DOC_STATUS     DOC_CATEGORY     DOC_DATE       
 1                123        Planned        OPEN             06-05-2012    
 7                123        Draft          OPEN             06-15-2012
 38               123        Approval       OPEN             06-20-2012
 102              123        Published      CLOSED           06-30-2012

私たちのドキュメントはすべてこの関数に同じテーブルを使用しているため、DOC_ENTRY_ID を単純にキー入力することはできませんでした。DOC_ID の最大 DOC_ENTRY_ID を見つけて計算する必要がありました。「CLOSED」のDOC_CATEGORYに到達し、そのDOC_IDのライフサイクルの終わりであるため、セルに「0」が挿入されるまでこれを行います。そのようです:

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

これは現在、View コードの大まかなドラフトを提供してくれた素晴らしい Tony Andrews のおかげですべて達成されています。

create or replace  view DOC_TIMELINE as
  select t.DOC_ENTRY_ID, t.DOC_ID, t.DOC_STATUS, t.DOC_CATEGORY, t.DOC_DATE
       , case when DOC_CATEGORY = 'CLOSED' 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;

私が今しなければならないこと:

これはすべて完全に機能しますが、最初のパスで、要件の非常に重要な部分を 1 つ忘れていました。私の目標は、ドキュメントが各フェーズでどれくらいの時間を費やしているかを知ることですが、ドキュメントが閉じられた後だけでなく、この情報をリアルタイムで収集する必要があることに気付くのを完全に怠っていました. この現在の設定では、ビューはライフサイクルの途中で次のようになります。

 DOC_ENTRY_ID  DOC_ID  DOC_STATUS  DOC_CATEGORY  DOC_DATE     DOC_DURATION     
 1             123     Planned     OPEN          06-05-2012   10     
 7             123     Draft       OPEN          06-15-2012   5
 38            123     Approval    OPEN          06-20-2012   -

問題が見えますか?そのドキュメントが承認状態にあった時間を知る必要がある場合は、その状態が終了するまで待って、その期間を計算する必要があります。そのため、20 日間その状態にあったとしても、私のメトリクスにはそれが反映されません。

特定の DOC_ID の MAX(DOC_ENTRY_ID) が DOC_CATEGORY = 'OPEN' の場合、SYSDATE() に対してこの値を計算するために、上記の View コードを微調整する方法を見つける必要があります。

 assuming SYSDATE() = '06-29-2012'
 DOC_ENTRY_ID  DOC_ID  DOC_STATUS  DOC_CATEGORY  DOC_DATE     DOC_DURATION     
 1             123     Planned     OPEN          06-05-2012   10     
 7             123     Draft       OPEN          06-15-2012   5
 38            123     Approval    OPEN          06-20-2012   9

それは意味がありますか?View コードに別の CASE を追加する必要があると想像していますが、sytanx が問題を引き起こしています。おそらく皆さんにとっては簡単な解決策ですが、この種のケースと許可されているsytanxについての私の知識は限られており、私の研究では関連するものは何も明らかにされていません.

すべての助けに心から感謝します。みんなありがとう!

4

1 に答える 1

1

このようなもの?-

create or replace  view DOC_TIMELINE as
  select t.DOC_ENTRY_ID, t.DOC_ID, t.DOC_STATUS, t.DOC_CATEGORY, t.DOC_DATE
       , case when DOC_CATEGORY = 'CLOSED' then 0
              when lead(DOC_DATE) over (partition by DOC_ID order by DOC_ENTRY_ID)
                   - DOC_DATE is null then trunc(sysdate)-trunc(DOC_DATE)
              else lead(DOC_DATE) over (partition by DOC_ID order by DOC_ENTRY_ID)
                   - DOC_DATE
              end as duration
  from TBL_DOC_TIMELINE t;

または以来、lead(DOC_DATE)常にnull最大の場合DOC_ENTRY_ID(aの場合DOC_ID)-

create or replace  view DOC_TIMELINE as
  select t.DOC_ENTRY_ID, t.DOC_ID, t.DOC_STATUS, t.DOC_CATEGORY, t.DOC_DATE
       , case when DOC_CATEGORY = 'CLOSED' then 0
              when lead(DOC_DATE) over (partition by DOC_ID order by DOC_ENTRY_ID) 
                      is null then trunc(sysdate)-trunc(DOC_DATE)
              else lead(DOC_DATE) over (partition by DOC_ID order by DOC_ENTRY_ID)
                   - DOC_DATE
              end as duration
  from TBL_DOC_TIMELINE t;
于 2012-08-15T20:09:29.970 に答える