0

次のデータ ギャップを見つけるクエリを作成する方法。

-- Scenario1 -- Query1 -- 同じテーブル内のギャップを見つける (例: tableb )

ID      EFF_DT                                  TERM_DT 
800    6/15/2012 12:00:00.000 AM    10/14/2012 12:00:00.000 AM      -- GAP 
800    10/16/2012 12:00:00.000 AM    11/14/2012 12:00:00.000 AM
800    11/15/2012 12:00:00.000 AM    12/31/9999 12:00:00.000 AM

-- Scenario2 -- Query2 -- 2 つのテーブル ( tablea 、 tableb ) 間の不一致を見つける

-- tablea  , sample data below 
ID      EFF_DT                                  TERM_DT 
400    6/15/2012 12:00:00.000 AM    10/14/2012 12:00:00.000 AM      
400    11/15/2012 12:00:00.000 AM    12/31/9999 12:00:00.000 AM

500    6/15/2012 12:00:00.000 AM    10/14/2012 12:00:00.000 AM      
500    10/15/2012 12:00:00.000 AM    11/14/2012 12:00:00.000 AM      
500    11/15/2012 12:00:00.000 AM    12/31/9999 12:00:00.000 AM

-- tableb, sample data below 
ID      EFF_DT                                  TERM_DT 
400    6/15/2012 12:00:00.000 AM    10/13/2012 12:00:00.000 AM      -- mismatch 
400    11/15/2012 12:00:00.000 AM    12/31/9999 12:00:00.000 AM

500    6/15/2012 12:00:00.000 AM    11/14/2012 12:00:00.000 AM      
500    11/15/2012 12:00:00.000 AM    12/31/9999 12:00:00.000 AM


-- Note 400 is a mismatch since ranges are different in both tables, 500 is okay (even though rows are split they still match )
-- Need to identify ID 400 

テーブルには、最低日付が 1753 年 1 月 1 日、最高日付が 12/31/9999 の場合があります。

次のクエリを試しましたが、最初のシナリオで oracle エラーがスローされます。[ ORA-01841: (完全な) 年は -4713 から +9999 の間である必要があり、0 ではありません]

SELECT ID, TERM_DT AS gap_lower_bound, next_date AS gap_upper_bound
  FROM (SELECT t.*,
               LEAD (EFF_DT)
                  OVER (PARTITION BY ID ORDER BY EFF_DT)
                  next_date
          FROM TABLEB t)
 WHERE                                      -- trim(next_date) is not null and
      next_date > TERM_DT + 1

ありがとうございました。

4

1 に答える 1

2

シナリオ 1 の場合、サンプルを取りましょう。

    ID    EFF_DT         TERM_DT 
____________________________________
    800 15-JUN-12   14-OCT-12 --GAP
    800 16-OCT-12   14-NOV-12
    800 15-NOV-12   31-DEC-12
    800 01-JAN-13   01-FEB-13  --GAP
    800 03-FEB-13   01-MAR-13

クエリは

    SELECT term_dt
FROM
     (SELECT t.*,
          lead(eff_dt,1) OVER (ORDER BY eff_dt) AS next_date
     FROM lead_test t
     )
WHERE term_dt+1<>next_date;

その結果:

 term_dt
__________
14-OCT-12
01-FEB-13

シナリオ 2 の場合:

同じselect to_date('12/31/9999', 'mm/dd/yyyy')+1 from dual;エラーがスローされます。

ORA-01841で使用した where 句の条件が原因でエラーが発生しています。TERM_DT + 1そのため、 にある値を変更/減少させることをお勧めします12/31/9999

于 2013-02-01T02:50:58.747 に答える