同一列中的日期之间的月份

时间:2016-04-13 13:51:21

标签: sql oracle11g

我可以请求帮助吗? 我需要计算相同产品ID的订单日期之间的月份。 我有以下数据集

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”值,并且每个下一个应该具有当前和之前的月份之间的值。

我不确定我是否设法解释得很好...... 请帮忙......

1 个答案:

答案 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()(下一个订单或前一个订单的时间)。您的数据未按日期排序,因此很难确定正确的排序。但是,你想要一个或另一个。