1

銀行システムから次のデータがあります。date, product code, due date.

私がする必要があるのは、各製品をdue_dates逆方向に入力することです。つまり、前の月に入力しますが、due_date <= date.

また、各製品内の最新の due_date の日付である max_date を入力したいと思います。

ご覧のとおり、1 つの製品内に多数の due_date がある場合と、まったくない場合があります。

複数の日付がある場合、以前のものは上書きされません。

これは今のように見えます:

    date        product    due_date
------------------------------------------
    2012-01-31    a1           
    2012-02-28    a1           
    2012-01-31    b1           
    2012-02-28    b1           
    2012-03-31    b1           
    2012-04-30    b1       2012-02-18    
    2012-05-31    b1           
    2012-06-30    b1       2012-05-31   
    2012-07-31    b1         
    2012-08-31    b1
    2012-09-30    b1       2012-09-01
    2012-10-31    b1
    2012-04-30    c1         
    2012-05-31    c1         
    2012-06-30    c1       2011-03-01    
    2012-07-31    c1      

これは私が得たい結果です:

     date        product    due_date      max_date
--------------------------------------------------------
     2012-01-31    a1           
     2012-02-28    a1           
     2012-01-31    b1                     2012-09-30
     2012-02-28    b1       2012-02-18    2012-09-30
     2012-03-31    b1       2012-02-18    2012-09-30
     2012-04-30    b1       2012-02-18    2012-09-30
     2012-05-31    b1       2012-05-31    2012-09-30
     2012-06-30    b1       2012-05-31    2012-09-30
     2012-07-31    b1                     2012-09-30
     2012-08-31    b1                     2012-09-30
     2012-09-30    b1       2012-09-01    2012-09-30
     2012-10-31    b1                     2012-09-30
     2012-04-30    c1       2011-03-01    2012-06-30
     2012-05-31    c1       2011-03-01    2012-06-30
     2012-06-30    c1       2011-03-01    2012-06-30
     2012-07-31    c1                     2012-06-30
4

2 に答える 2

1

このクエリを試してみると便利かもしれません。データの例では問題なく動作します (ここで試すことができます):

WITH temp1 AS (
  SELECT ROW_NUMBER() OVER (PARTITION BY product ORDER BY date_f,product ASC) AS row_num,
             date_f,
             product,
             due_date
   FROM TEST
), temp2 AS (
  SELECT row_num,date_f,product, due_date FROM temp1 WHERE NOT due_date IS NULL
), temp3 AS (
  SELECT product, MAX(date_f) AS max_due_date
  FROM TEST
  WHERE NOT due_date IS NULL
  GROUP BY product
)
SELECT 
to_char(a.date_f,'YYYY-MM-DD') AS DATE_F, 
a.product,
to_char(NVL(a.due_date,
  (SELECT MIN(b.due_date) 
   FROM temp2 b 
   WHERE b.product = a.product AND b.due_date <= a.date_f AND a.row_num < b.row_num)),'YYYY-MM-DD') AS due_date,
to_char(
  (SELECT c.max_due_date FROM temp3 c
  WHERE c.product = a.product AND ROWNUM = 1),'YYYY-MM-DD') AS max_date
FROM temp1 a

注:現時点ではこれ以上のことはできませんでした:(

于 2013-07-16T14:51:00.107 に答える