我的数据格式为:
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
我是否必须使用递归查询?
答案 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;