0

Oracle 11i - CUSTOM 値が STANDARD 値をオーバーライドし、STANDARD 値がオーバーライドされない場所に保持される一連の日付範囲を作成するクエリを探しています。

STANDARD
CUSTOMER_ID  START_DATE  END_DATE     VALUE
0001         02/01/2013  09/15/2013   10

CUSTOM
CUSTOMER_ID  START_DATE  END_DATE     VALUE
0001         01/15/2013  03/15/2013   20
0001         07/01/2013  07/31/2013   30

Desired Result
CUSTOMER_ID  START_DATE  END_DATE     VALUE
0001         02/01/2103  03/15/2013   20
0001         03/16/2013  06/30/2013   10
0001         07/01/2013  07/31/2013   30
0001         08/01/2013  09/15/2013   10

試運転の結果は次のとおりです。

select sc.customer_id, sc.thedate as start_date,
       lead(**sc.thedate**) over (partition by sc.customer_id order by sc.thedate) as end_date,
       sc.value
from (select customer_id, start_date as thedate, value
      from standard
      union all
      select customer_id, start_date, value
      from custom
      union all
      select s.customer_id, c.end_date + 1, s.value
      from custom c join
           standard s
           on c.customer_id = s.customer_id
      union all
      select customer_id, end_date, NULL
      from standard
     ) sc
where value is not NULL;

CUSTOMER_ID     START_DATE              END_DATE                VALUE
0001            15-JAN-13 12.00.00 AM   01-FEB-13 12.00.00 AM   20
0001            01-FEB-13 12.00.00 AM   16-MAR-13 12.00.00 AM   10
0001            16-MAR-13 12.00.00 AM   01-JUL-13 12.00.00 AM   10
0001            01-JUL-13 12.00.00 AM   01-AUG-13 12.00.00 AM   30
0001            01-AUG-13 12.00.00 AM                           10
4

1 に答える 1

0

ここにアプローチがあります。値が開始する日付ごとに (顧客ごとに) データを分割します。次に、Oracle 分析関数を使用してデータをまとめます。日付は「値」の開始日です。次にlead()、次の日付を取得するために使用します。

select sc.customer_id, sc.thedate as start_date,
       lead(sc.start_date) over (partition by sc.customer_id order by sc.thedate) as end_date,
       sc.value
from (select s.customer_id, s.start_date as thedate, s.value
      from standard
      union all
      select c.customer_id, c.start_date, c.value
      from custom
      union all
      select s.customer_id, c.end_date + 1, s.value
      from custom c join
           standard s
           on c.customer_id = s.customer_id
      union all
      select s.customer_id, s.end_date, NULL
      from standard
     ) sc
where value is not NULL;

end_dateこれには、最後の行として必要のないの余分なレコードが含まれていることに注意してください。これは値でタグ付けNULLされ、外側のクエリで除外されます。

于 2013-08-29T03:25:17.533 に答える