0

私は私が助けを必要とする次のシナリオを持っています

ID_Number Budget_Period Start_Date End_date Period_Type
   1 12/12/20072/11/2008年次
   122008年3月15日2009年3月14日年次
   132009年4月15日2010年4月14日年次
   212010年8月18日2011年8月17日年次
   222011年9月19日2012年9月18日年次

必要なのは、特定のIDの開始日と終了日を連続させて、その特定のID_numberの予算期間にギャップがないようにすることです。たとえば、ID_Number 1の場合、Min(Start_date)は2007年2月12日です。 Max(End_date)は2010年4月14日であるため、各予算期間のデータは、以下に示すように、開始日と終了日の間に364日だけ離れている必要があります。

必要な出力

ID_Number Budget_Period Start_Date End_date Period_Type
   1 12/12/20072/11/2008年次
   1 22/12/20082/11/2009年次
   132010年2月12日2010年4月14日年次
   212010年8月18日2011年8月17日年次
   222011年8月18日2012年9月18日年次

これは分析関数を使用して実行できますか?試したクエリを使用して必要な出力を取得できません。助けていただければ幸いです。

4

2 に答える 2

1

各範囲が 1 年から 1 日を引いたものである場合、出力はこれであるべきではありませんか?

SQL> select id_number, i+1 budget_period, start_date, end_date, 'Annual' period_type
  2    from (select id_number, min(start_date) start_date, max(end_date) end_date from a
  3           group by id_number)
  4         model
  5           partition by (id_number)
  6           dimension by (0 as i)
  7           measures(start_date, end_date, end_date ed)
  8           rules
  9           (start_date[for i from 1 to ceil(months_between(add_months(end_date[0],-12), start_date[0])/12)
 10                       increment 1] = add_months(start_date[0], 12*cv(i)),
 11            end_date[any] = least(ed[0], add_months(start_date[CV()], 12)-1)
 12           )
 13   order by 1,2;

 ID_NUMBER BUDGET_PERIOD START_DAT END_DATE  PERIOD
---------- ------------- --------- --------- ------
         1             1 12-FEB-07 11-FEB-08 Annual
         1             2 12-FEB-08 11-FEB-09 Annual
         1             3 12-FEB-09 11-FEB-10 Annual
         1             4 12-FEB-10 14-APR-10 Annual
         2             1 18-AUG-10 17-AUG-11 Annual
         2             2 18-AUG-11 17-AUG-12 Annual
         2             3 18-AUG-12 18-SEP-12 Annual

7 rows selected.
于 2012-12-01T01:38:16.160 に答える
0

終了日を指定しなくても問題ありません。次のレコードの開始日が翌日の場合は冗長です。

于 2012-12-01T00:01:54.480 に答える