2016-04-13 6 views
1

何か助けてもらえますか? 同じ商品IDの注文日の間に月を計算する必要があります。 は、私は、次のデータが列order_numが一意の値である同じ欄に日付を入れてください

ORDER_NUM PRODUCT_ID ORDER_DATE 
111111 222222 2015-05-20 18:30:38 
111112 222223 2015-12-03 19:25:23 
111113 222224 2015-12-30 18:16:25 
111114 222225 2015-10-30 12:32:06 
111115 222226 2015-12-26 16:14:33 
111116 222227 2016-03-08 10:23:39 
111117 222224 2015-10-01 09:04:56 
111118 222223 2015-04-21 11:48:03 
111119 222228 2015-11-14 10:00:38 
111120 222229 2016-03-22 10:42:32 
111121 222230 2015-11-10 12:14:41 
111122 222231 2015-11-24 10:05:40 
111123 222222 2015-12-05 12:18:28 
111124 222232 2015-12-07 11:23:53 
111125 222233 2015-07-17 10:47:54 
111126 222234 2016-02-08 11:59:30 
111127 222235 2015-11-08 15:40:08 
111128 222223 2015-09-24 11:16:03 
111129 222236 2015-11-09 12:30:04 

を設定している、PRODUCT_IDは、多くの時間と時間を表示されることがあります。 PRODUCT_IDの初登場はMONTHS_BETWEENに「0」の値を持つ必要があり、それぞれ次の値を現在と以前の間に数ヶ月を持っている必要があり

ORDER_NUM PRODUCT_ID MONTHS_BETWEEN 
111111 222222 0 
111112 222223 2 
111113 222224 3 
111114 222225 0 
111115 222226 0 
111116 222227 0 
111117 222224 0 
111118 222223 0 
111119 222228 0 
111120 222229 0 
111121 222230 0 
111122 222231 0 
111123 222222 7 
111124 222232 0 
111125 222233 0 
111126 222234 0 
111127 222235 0 
111128 222223 5 
111129 222236 0 

: 私はのようになり、結果を必要としています。

私は、私は非常によく説明するために管理していることを確認していない... 助けてください...

答えて

3

あなたがmonths_between()lead()使用することができます。これは数を返し

  • select t.*, 
         months_between(lead(order_date() over (partition by product_id order by order_date)), 
             order_date 
            ) as MonthsBetween 
    from t; 
    

    ノート小数点以下桁で整数を取得するには、trunc()またはround()を使用します。

  • 「次の」注文がない場合はNULLを返します。もしあなたが好きな場合はCOALESCE()を使ってそれを0(または何か他のもの)に変換することができます。
  • 正直言って、lead()またはlag()(次の注文または前の注文までの時間)が必要かどうかはわかりません。あなたのデータは日付順に並べられていないため、正しい注文を見つけることが難しいです。しかし、どちらか一方が欲しい。
+0

鉛は常に最初の行に結果を持ち、遅れは常に最後の行に結果があると思います。 ...それは私が選ぶ方法です。 – Hogan

+0

それは働いた!ありがとうございました! – JONSY

関連する問題