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
其中ORDER_NUM是唯一值,PRODUCT_ID也可能出现多次和时间。 我需要结果如下:
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
PRODUCT_ID的第一次出现在MONTHS_BETWEEN中应该具有“0”值,并且每个下一个应该具有当前和之前的月份之间的值。
我不确定我是否设法解释得很好...... 请帮忙......
答案 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()
(下一个订单或前一个订单的时间)。您的数据未按日期排序,因此很难确定正确的排序。但是,你想要一个或另一个。