使用日期条件创建有序标志

时间:2016-03-25 19:50:58

标签: sql oracle

我的数据格式为:

id  start_date  end_date
25  1-Jan-00    24-Jan-00
25  26-Jan-00   5-Feb-00
25  3-Nov-00    6-Mar-01
25  10-Mar-01   4-Jun-02
25  2-Jul-03    6-Aug-03
93  2-May-14    4-May-14
93  8-May-14    6-Aug-14
93  9-Aug-14    1-Feb-15
93  3-Feb-15    14-Mar-15
93  9-Jul-15    1-Dec-15
93  2-Mar-16    7-Mar-16
93  2-Apr-16    1-May-16

我想创建一个名为' string_num'如果前一行的结束日期(按id和start_date排序)在当前行的开始日期的7天内,则将行视为字符串的一部分。最后看起来像这样:

id  start_date  end_date    string_num
25  1-Jan-00    24-Jan-00   1
25  26-Jan-00   5-Feb-00    1
25  3-Nov-00    6-Mar-01    2
25  10-Mar-01   4-Jun-02    2
25  2-Jul-03    6-Aug-03    3
93  2-May-14    4-May-14    1
93  8-May-14    6-Aug-14    1
93  9-Aug-14    1-Feb-15    1
93  3-Feb-15    14-Mar-15   1
93  9-Jul-15    1-Dec-15    2
93  2-Mar-16    7-Mar-16    3
93  2-Apr-16    1-May-16    4

我是否必须使用递归查询?

1 个答案:

答案 0 :(得分:1)

您可以使用分析功能执行此操作。 LAG()用于获取上一个日期。然后使用SUM()用一些逻辑做累积求和:

select t.*,
       sum(case when prev_end_date + 7 >= start_date then 0 else 1
           end) over (partition by id order by start_date) as string_num
from (select t.*,
             lag(end_date) over (partition by id order by start_date) as prev_end_date
      from t
     ) t;